zoukankan      html  css  js  c++  java
  • 【原创】_INTSIZEOF 内存按照int对齐

    #include <stdarg.h> 里面定义了如下宏

    #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

    主要作用是用于将变量n按照int大小内存地址对齐,返回内存对齐后n的大小(一般>=sizeof(n))

    公式的计算方式如下过程:是转载过来了的

    对于两个正整数 x, n 总存在整数 q, r 使得

    x = nq + r, 其中  0<= r <n                  //最小非负剩余

    q, r 是唯一确定的。q = [x/n], r = x - n[x/n]. 这个是带余除法的一个简单形式。在 c 语言中, q, r 容易计算出来: q = x/n, r = x % n.


    所谓把 x 按 n 对齐指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n. 这也相当于把 x 表示为:

    x = nq + r', 其中 -n < r' <=0                //最大非正剩余   

    nq 是我们所求。关键是如何用 c 语言计算它。由于我们能处理标准的带余除法,所以可以把这个式子转换成一个标准的带余除法,然后加以处理:

    x+n = qn + (n+r'),其中 0<n+r'<=n            //最大正剩余

    x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1 <n    //最小非负剩余

    所以 qn = [(x+n-1)/n]n. 用 c 语言计算就是:

    ((x+n-1)/n)*n

    若 n 是 2 的方幂, 比如 2^m,则除为右移 m 位,乘为左移 m 位。所以把 x+n-1 的最低 m 个二进制位清 0就可以了。得到:

    (x+n-1) & (~(n-1))

     因为是用在va_start里面,栈里参数的对齐应该是int对齐的,所以要这么搞

  • 相关阅读:
    Java实现热替换
    SQL判断字符串里不包含字母
    Useful bat command
    Entity FrameworkCore教程(一):包概念理解
    Docker:Docker常见命令
    ASP.NET Core:ASP.NET Core程序使用Docker部署
    ASP.NET Core:中间件
    ASP.NET Core:依赖注入
    Jenkins:创建定时构建任务
    ASP.NET Core 3.1使用Swagger
  • 原文地址:https://www.cnblogs.com/vanishfan/p/4333090.html
Copyright © 2011-2022 走看看