为什么一个模块中的类成员变量的对齐方式与另一个模块中的不同? 我使用Visual Studio 2019、WSL Ubuntu 18.04 LTS和GCC(Ubuntu 7.5.0~3Ubuntu1~18.04)7.5.0移植Windows C++程序到Linux。 编译x64。 在Windows中工作正常,但在Linux中则不行。 精简源文件: 在头文件中: class CDetail { public: CDetail(); ~CDetail(); CDetail *Function(void); char m_code; char m_name[100]; };

为什么一个模块中的类成员变量的对齐方式与另一个模块中的不同? 我使用Visual Studio 2019、WSL Ubuntu 18.04 LTS和GCC(Ubuntu 7.5.0~3Ubuntu1~18.04)7.5.0移植Windows C++程序到Linux。 编译x64。 在Windows中工作正常,但在Linux中则不行。 精简源文件: 在头文件中: class CDetail { public: CDetail(); ~CDetail(); CDetail *Function(void); char m_code; char m_name[100]; };,class,variables,gcc,alignment,visual-studio-2019,Class,Variables,Gcc,Alignment,Visual Studio 2019,在模块A中: CDetail *pointer = My Detail; pointer->Function(); 在模块B中: CDetail* CDetail::Function() { char *name = m_name; . . } 调试时: (这些值是扩展类的实际值) 在模块A中,指针的值为0x55557D72B9 &(指针->m_名称)的值为0x55557D72B9 在模块B中,的值为0x55557D72B9(如预期的那样) &m_name的值为0x

在模块A中:

  CDetail *pointer = My Detail;
  pointer->Function();
在模块B中:

CDetail* CDetail::Function()
{
  char *name = m_name;
  .
  .
}
调试时:
(这些值是扩展类的实际值)
在模块A中,指针的值为0x55557D72B9
&(指针->m_名称)的值为0x55557D72B9

在模块B中,的值为0x55557D72B9(如预期的那样)
&m_name的值为0x55557D72B6(关闭3个字节)


这看起来像是对齐问题。如何解决这个问题?

为什么您希望
m_name
的地址与
CDetail
对象的地址相同?
m_code
成员去了哪里?可能模块是针对类的不同版本编译的?m_name的地址必须与pointer->m_name的地址相同,因为它引用的是对象的同一实例。m_代码的地址是相同的。“全部生成”并不能解决问题。为什么希望
m_name
的地址与
CDetail
对象的地址相同?
m_code
成员去了哪里?可能模块是针对类的不同版本编译的?m_name的地址必须与pointer->m_name的地址相同,因为它引用的是对象的同一实例。m_代码的地址是相同的。“全部构建”并不能解决问题。