C语言能保证sizeof(long) == sizeof(void*)吗?如果没有,为什么它在Linux内核源代码中被如此广泛地使用?
我看过sizeof (int) == sizeof (void*)?,但它谈到了sizeof(int)与sizeof(void *)。
发布于 2020-08-25 06:56:40
不,C标准不能保证sizeof(long) == sizeof(void *)。
实际上,在Windows64位系统上,sizeof(long)的值为4,sizeof(void *)的值为8。本设计符合C语言标准。另请参阅What is the bit-size of long on 64-bit Windows?
那些实现Linux内核的人可能已经决定,他们永远不会将代码移植到遵循Windows64位LLP64 (long long和指针是64位数量)系统的系统上,因此不需要关心大小是否不同。32位系统(ILP32)和64位系统(LP64)都有sizeof(long) == sizeof(void *)。但是C标准并不能保证这一点。
发布于 2020-08-25 07:48:30
唯一的保证是:
void *和alignment;sizeof (const int *) == sizeof (int *));struct指针类型具有相同的大小,而char * union指针类型具有相同的大小和对齐方式;就这样。
如果Linux内核开发人员正在编写假设为sizeof (long) == sizeof (void *)的代码,那么他们已经决定限制他们将要支持的平台。这绝对没问题--你不需要支持所有奇怪的架构。
https://stackoverflow.com/questions/63569700
复制相似问题