gpt4 book ai didi

c++ - MSVC C++ 17 - 警告 C4121 "alignment of a member was sensitive to packing"

转载 作者:太空狗 更新时间:2023-10-29 21:32:43 25 4
gpt4 key购买 nike

我已经在 VS2017(版本 15.9)和 VS2019 预览版上尝试了以下代码 - 这是误报吗?

class Base {};
class Derived1 : public virtual Base {}; // to avoid diamond pattern in real code
class Derived2 : public Base {};

struct S1 {
int i;
void(Derived1::*func)(); // warning C4121 - see below for full text
};

struct S2 {
int i;
void(Derived2::*func)(); // no warning
};

int main()
{

}

r:\cpp2019\cpp2019\cpp2019.cpp(9) : warning C4121 : 'S1' : alignment of a member was sensitive to packing

我已使代码尽可能简单(这显然不是实际的生产代码)。在生产代码(一个巨大的代码库)中,警告是由于使用基于范围的 for 循环迭代 map 。 循环变量当然是std::pair<keytype, valuetype> ,值类型类似于funcstruct S1 .

生产代码在 VS2015 中编译良好,但现在使用 VS2017 并将语言标准设置为 C++17,我收到此警告。

最佳答案

是因为sizeof(S1::func)==sizeof(void*)*3,由于支持虚继承,而sizeof(S2::func)= =sizeof(void*)*1

您可以通过#pragma pointers_to_members 控制成员指针的实现。例如,对于这两种情况,您都会收到警告。

#pragma pointers_to_members( full_generality, virtual_inheritance)

默认打包为 8,警告是合乎逻辑的。

我仍然认为这是误报。虽然这样的指针会出现在明显未对齐的边界上,但它实际上实现为三个指针,因此每个指针都将正确对齐。

关于c++ - MSVC C++ 17 - 警告 C4121 "alignment of a member was sensitive to packing",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54029067/

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