gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:42:31 25 4
gpt4 key购买 nike

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

关于为什么会发生这种情况有什么想法吗?

提前致谢。

最佳答案

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

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

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

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

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

P.S. 正如 Fred 在评论中指出的,翻译单元之间类内存布局的差异可能是由一些平淡无奇的事情引起的,例如在修改源文件头文件后忘记重新编译源文件取决于。

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

关于c++ - 内联函数返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4939921/

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