在C ++中,是否可以强制编译器在顺序存储器位置排列一系列全局或静态对象?或者这是默认行为?例如,如果我写...
MyClass g_first (“first”);
MyClass g_second (“second”);
MyClass g_third (“third”);
...这些对象会占用连续的内存块,还是编译器可以自由地将它们放在地址空间的任何位置?
答案 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)