我想知道,大多数实现是否也calloc
将大小视为对齐,并将其四舍五入到下一个支持的粒度?
如果是这样,那么它们是四舍五入到 2 的下一个幂,还是四舍五入到 8 或 16 的下一个倍数?
如果calloc
保持参数相同,那么它是如何工作的呢?你的数据不会不对齐吗?
谢谢!
我想知道,大多数实现是否也calloc
将大小视为对齐,并将其四舍五入到下一个支持的粒度?
如果是这样,那么它们是四舍五入到 2 的下一个幂,还是四舍五入到 8 或 16 的下一个倍数?
如果calloc
保持参数相同,那么它是如何工作的呢?你的数据不会不对齐吗?
谢谢!
sizeof
被定义为产生数组中对象的大小——换句话说,它已经考虑了正确对齐所需的任何填充。因此,如果sizeof(foo)
某个 object 是 23 foo
,那么您的处理器必须是字节对齐的。(另一方面,如果你通过 23 岁是因为你只是认为通过它是一个很好的价值,那么祝你好运;你靠自己。)
就对齐而言,calloc(1000, 23)
恰好等价于malloc(1000 * 23)
。如果实现决定以某种方式“对齐”大小,它会将总大小对齐23000
到某个更大的实现定义的值。没有对第二个参数calloc
(或第一个,就此而言)应用特殊处理。
捕捉23
到24
实际上calloc(1000, 23)
意味着捕捉23000
到24000
(就总大小而言)。没有合理的实际实现需要添加整个1000
用于对齐目的。