• 【原创】_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对齐的,所以要这么搞

  • 相关阅读:
    03_ if 练习 _ little2big
    uva 11275 3D Triangles
    uva 12296 Pieces and Discs
    uvalive 3218 Find the Border
    uvalive 2797 Monster Trap
    uvalive 4992 Jungle Outpost
    uva 2218 Triathlon
    uvalive 3890 Most Distant Point from the Sea
    uvalive 4728 Squares
    uva 10256 The Great Divide
  • 原文地址:https://www.cnblogs.com/vanishfan/p/4333090.html
Copyright © 2020-2023  润新知