gpt4 book ai didi

c++ - Visual C++不遵守堆栈变量的对齐方式

转载 作者:行者123 更新时间:2023-12-03 07:01:59 26 4
gpt4 key购买 nike

使用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++标准的一些怪癖?

最佳答案

这是一个错误。
在x86上,除非操作数自然对齐,否则某些操作可能会导致性能下降。显然,Visual C++有一个不一致的alignof运算符,该运算符返回自然对齐方式,而不是类型所需的对齐方式。使用32位MSVC构建时,uint64_t / double的自然对齐方式为8,而其所需的对齐方式为4。因此,在上面的代码中,x的地址必须为4的倍数,但不一定是alignof(X)的倍数。
令人困惑的行为是uint64_t x;alignas(uint64_t) uint64_t x;的含义不同。只有后者具有预期的对齐方式。
另请参阅:GCC修复类似的bug和关联的libc++ updates

关于c++ - Visual C++不遵守堆栈变量的对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64865140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com