【发布时间】:2011-03-07 10:47:48
【问题描述】:
当您在 C++ 头文件中有一个静态全局变量时,包含该头文件的每个翻译单元都会以自己的变量副本结束。
但是,如果我在同一个头文件中声明一个类,并创建该类的成员函数,在类声明中内联实现,它使用静态全局变量,例如:
#include <iostream>
static int n = 10;
class Foo {
public:
void print() { std::cout << n << std::endl; }
};
然后我看到 gcc 4.4 下的行为有点奇怪:
如果我在没有优化的情况下进行编译,则成员函数的所有使用都使用来自一个翻译单元(g++ 命令行中提到的第一个)的变量副本。
如果我使用
-O2进行编译,则每次使用成员函数都会使用生成案例的翻译单元中的变量副本。
显然这是一个非常糟糕的设计,所以这个问题只是出于好奇。但是我的问题是,C++ 标准对这种情况有什么看法?在启用和不启用优化的情况下提供不同的行为,g++ 的行为是否正确?
【问题讨论】:
标签: c++ gcc global-variables