在内存中按顺序排列全局/静态对象

时间:2009-09-28 08:27:34

标签: c++ memory compiler-construction memory-management

在C ++中,是否可以强制编译器在顺序存储器位置排列一系列全局或静态对象?或者这是默认行为?例如,如果我写...

MyClass g_first (“first”);
MyClass g_second (“second”);
MyClass g_third (“third”);

...这些对象会占用连续的内存块,还是编译器可以自由地将它们放在地址空间的任何位置?

4 个答案:

答案 0 :(得分:3)

编译器在将静态对象放入内存时可以随心所欲;如果你想更好地控制你的全局变量的位置,你应该考虑编写一个包含所有全局变量的struct。这将保证您的对象将按顺序和可预测的顺序打包。

答案 1 :(得分:0)

将特定变量或变量组放入内存段不是编译器的标准功能。

但是有些编译器支持特殊方法来执行此操作。尤其是嵌入式系统。例如在Keil中,我猜您在 at 运算符处放置一个特定变量。

答案 2 :(得分:0)

强制对象在连续内存中的方法是将它们放入数组中。

如果使用内置数组类型,则可以初始化它们的唯一方法是它们的默认构造函数(尽管您可以稍后更改它们的值):

MyClass my_globals[3];

如果使用动态数组(在C ++中称为std::vector),则更灵活:

namespace {
  typedef std::vector<MyClass> my_globals_type;

  my_globals_type init_my_globals()
  {
    my_globals_type globals;
    globals.push_back(MyClass(“first”));
    globals.push_back(MyClass(“second”));
    globals.push_back(MyClass(“third”));
    return globals;
  }

  my_globals_type my_globals = init_my_globals();
}

请注意,全局变量通常不受欢迎。这是正确的。

答案 3 :(得分:0)