内联函数返回不正确的结果

时间:2011-02-08 23:55:46

标签: 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 };
};

我们看到的是myFunct1返回myVal2而myFunct2返回myVal3。如果我不使内联函数一切正常工作。

关于为什么会发生这种情况的任何想法?

提前致谢。

2 个答案:

答案 0 :(得分:11)

(我假设您上面发布的内容实际上是某个头文件中的一个片段。)

这样的事情通常发生在程序中的不同源文件使用不同的内存布局相关设置编译时,例如类打包和对齐设置。您的头文件包含在这些不同的翻译单元中,并且由于内存布局设置的差异而被不同地解释。

一旦您开始在这些翻译单元之间传递Test个对象,问题就会显现出来。一个翻译单元创建一个具有一个内存布局的Test对象,然后另一个翻译单元读取或写入假设完全不同的内存布局。在您的情况下,您的内联函数在每个翻译单元中的解释方式不同。

如果将成员函数定义为非内联函数,则它们将假定特定于定义它们的源文件的类内存布局。这将扫除地毯下的问题并使事情“正常”(因为访问功能现在与一个内存布局相关联),但是仍然不是一个好的情况。它仍然可能导致类似性质的各种问题。

确保程序中的所有源文件都使用完全相同的类内存布局设置进行编译。

PS 正如弗雷德在评论中指出的那样,翻译单元之间的类内存布局的差异可能是由于在修改源文件之后忘记重新编译源文件这样平淡无奇的原因造成的取决于。

此类问题的另一个“流行”来源是依赖于预处理程序指令的类定义(即,#ifdef / #endif段“定制”的类布局)。如果您忘记#define某些包含头文件的源文件中的重要内容,则可能最终会为该源文件中的类设置不同的内存布局。

答案 1 :(得分:3)

不,内联函数(当然)需要与非内联函数具有相同的结果。因此,问题必须在其他地方,在您未显示的代码中。也许是那个神奇地设定私人成员价值的人?