下面的代码是100%可移植的吗?
int a=10;
size_t size_of_int = (char *)(&a+1)-(char*)(&a); // No problem here?
std::cout<<size_of_int;// or printf("%zu",size_of_int);
P.S: 这个问题只是为了学习。所以请不要给出类似的答案Use sizeof()
etc
来自 ANSI-ISO-IEC 14882-2003,第 87 页 (c++03):
"75) 另一种接近指针的方法
算术首先要转换
指向字符指针的指针: In
该方案的积分值
表达式相加或相减
转换后的指针是第一个
乘以物体的大小
最初指出的是
结果指针被转换回
原始类型。对于指针
减法,结果
性格之间的差异
指针类似地除以
最初指向的对象的大小
到。”
这似乎表明指针差等于对象大小。
如果我们删除增加指向标量 a 的指针的 UB'ness 并将 a 转换为数组:
int a[1];
size_t size_of_int = (char*)(a+1) - (char*)(a);
std::cout<<size_of_int;// or printf("%zu",size_of_int);
那么这看起来不错。如果对齐要求始终能被对象的大小整除,则有关对齐要求的条款与脚注一致。
UPDATE:有趣的。大多数人可能都知道,GCC 允许指定类型的显式对齐作为扩展。但我不能用它破坏OP的“sizeof”方法,因为GCC拒绝编译它:
#include <stdio.h>
typedef int a8_int __attribute__((aligned(8)));
int main()
{
a8_int v[2];
printf("=>%d\n",((char*)&v[1]-(char*)&v[0]));
}
消息是error: alignment of array elements is greater than element size
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)