Jum*_*ith 3 c++ inline inline-code
我有一个大型应用程序,我正在使用C++,我们有一个类,其中内联函数返回错误的值.看起来它们被一个条目所抵消.
以下是代码设置方式的示例:
class Test
{
private:
uint myVal1;
uint myVal2;
uint myVal3;
uint myVal4;
public:
uint myFunct1() const { return myVal1 };
uint myFunct2() const { return myVal2 };
};
Run Code Online (Sandbox Code Playgroud)
我们看到的是myFunct1返回myVal2而myFunct2返回myVal3.如果我不使内联函数一切正常工作.
关于为什么会发生这种情况的任何想法?
提前致谢.
AnT*_*AnT 11
(我假设您上面发布的内容实际上是来自某个头文件的片段.)
当程序中的不同源文件使用不同的内存布局相关设置(如类打包和对齐设置)进行编译时,通常会发生这种情况.您的头文件包含在这些不同的翻译单元中,并且由于内存布局设置的差异而被不同地解释.
一旦开始Test在这些翻译单元之间传递对象,问题就会显现出来.一个翻译单元创建一个Test具有一个内存布局的对象,然后另一个翻译单元读取它或写入其中假设完全不同的内存布局.在您的情况下,您的内联函数在每个翻译单元中的解释方式不同.
如果将成员函数定义为非内联函数,则它们将假定特定于定义它们的源文件的类内存布局.这将扫除地毯下的问题并使事情"起作用"(因为访问功能现在与一个内存布局相关联),但是仍然不是一个好的情况.它仍然可能导致类似性质的各种问题.
确保程序中的所有源文件都使用完全相同的类内存布局设置进行编译.
PS正如弗雷德在评论中指出的那样,翻译单元之间的类内存布局的差异可能是由于在修改源文件所依赖的头文件之后忘记重新编译源文件而引起的.
此类问题的另一个"流行"来源是依赖于预处理程序指令的类定义(即,由#ifdef/ #endifsegments 定制的"类" ).如果您#define在包含头文件的某个源文件中忘记了某些重要内容,则最终可能会为该源文件中的类设置不同的内存布局.