【发布时间】:2021-02-28 01:43:42
【问题描述】:
使用 Visual Studio 16.8.1 为 x86 编译后有时会失败:
#include <cassert>
#include <cstdint>
struct X { uint64_t value; };
int main() {
X x;
assert(reinterpret_cast<uintptr_t>(&x) % alignof(X) == 0);
}
有趣的是,如果X 有明确的对齐说明符:struct alignas(uint64_t) X,则断言不会触发。
我认为这是编译器错误而不是 C++ 标准的一些怪癖是否正确?
【问题讨论】:
-
也许这个怪癖在您的期望中。为什么您希望断言成立?
-
我希望
x按照对齐要求放置在内存中。 -
但是
x的地址只是一些地址,对齐是什么? (顺便说一句,我不知道这里发生了什么,我只是好奇并期待答案) -
在 32 位构建中结构的对齐要求是 32 位。
-
与地址
0对齐。如果x与N对齐,我希望它的地址是N的倍数。
标签: c++ visual-c++