3

我有一个正在使用 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。如果我不使函数内联,一切都会按预期工作。

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

提前致谢。

4

2 回答 2

12

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

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

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

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

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

PS正如 Fred 在评论中指出的那样,翻译单元之间的类内存布局差异可能是由于在修改源文件所依赖的头文件后忘记重新编译源文件等平淡无奇的事情造成的。

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

于 2011-02-09T00:01:38.393 回答
3

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

于 2011-02-09T00:02:45.493 回答