![]() |
1
13
从ANSI-ISO-IEC 1488—2003,P.78(C++ 03):
这似乎表明指针差等于对象大小。 如果我们从增加指向标量a的指针并将a转换为数组中删除了ub'ness:
那么这个看起来不错。有关对齐要求的条款与脚注一致,如果对齐要求总是可以被对象的大小整除。 更新: 有趣。正如大多数人可能知道的,gcc允许将类型的显式对齐指定为扩展。但我不能用它破坏op的“sizeof”方法,因为gcc拒绝编译它:
消息是
|
![]() |
2
4
这意味着5.7/5可以不使用ub。最后,5.7/6中的75条评论为
在生产代码中应该使用
|
![]() |
3
2
不,这个代码在每个平台上都不能像您期望的那样工作。至少在理论上,可能有一个平台,例如24位整数(=3字节)但32位对齐。对于(旧的或更简单的)平台,这样的对准并非不典型。然后,代码将返回4,但sizeof(int)将返回3。 但我不知道真正的硬件是这样的。实际上,您的代码将在大多数或所有平台上工作。 |
![]() |
4
2
它不是100%可移植的,原因如下:
免责声明:我不确定上面是否有C++。 |
![]() |
5
1
为什么不只是:
|
![]() |
6
1
它可能是实现定义的。 我可以想象一个(假设的)系统,其中sizeof(int)小于默认对齐。
这样说才安全
|
![]() |
7
0
上面的代码可以方便地计算
|
![]() |
8
0
是的,它给了你相当于
|
![]() |
9
0
有一场关于 similar question . 查看评论 my answer 对于这个问题,有些人提出了这样的问题:为什么这不仅是不可移植的,而且是标准中未定义的行为。 |
![]() |
Jiji · 将简单对象强制转换为简单的通用接口 7 年前 |
![]() |
tobeypeters · 反射铸造 7 年前 |
![]() |
Alex · 是否改为存储字符串的整数的通用ArrayList? 7 年前 |
![]() |
Kai · 如何在C#中转换会话中存储的词典? 7 年前 |
![]() |
Ján ЯabÄan · 布尔值到双精度的快速转换方法 7 年前 |