我想知道,大多数实现是否也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用于对齐目的。