如果我有一个像这样的全局变量列表......
int a;
char b;
float c[10];
double d[3];
我在类中列出了相同的变量序列......
class test_type
{
int a;
char b;
float c[10];
double d[3];
}
保证内存中所有变量的排列是相同的。即'b'保证在全局列表和班级列表中的'a'之后立即存储?
编辑:我问,因为我想A)将数据从一个复制到另一个作为“工作批次”和B)我想检查它们之间的任何差异作为工作批次。如果主要问题的答案是“否”,那么是否有人对如何解决问题有任何建议,最好尽可能保持现有代码不变。
答案 0 :(得分:8)
没有。我认为C ++标准不保证全局变量的内存布局。
答案 1 :(得分:6)
为什么不简单地使用test_type类型的全局对象而不是定义多个全局变量?
class test_type
{
int a;
char b;
float c[10];
double d[3];
};
test_type global;
现在,使用“global”副本初始化一个新的test_type对象是件小事。
答案 2 :(得分:1)
C / C ++标准不要求变量按其声明的顺序存储。因此编译器可以按他们想要的顺序自由存储变量。但保证它们将按照声明的顺序进行初始化。全局和类成员变量都是如此。
关于全局变量的一些注释:在编译单元中,它们将按指定的顺序初始化,但是这个保证不会在编译单元中应用。
答案 3 :(得分:0)
内存分配取决于编译器。因此,无法保证连续分配或全局和类成员变量的相同分配。
答案 4 :(得分:0)
不,你不能依赖它。编译器如何为变量分配内存。
答案 5 :(得分:0)
不,不保证。根据您想要做的事情,您可以使用指向成员的运算符来确保您知道成员变量的相对地址。
所以在你的班上:
class test_type
{
int a;
char b;
float c[10];
double d[3];
}
void* pa = &test_type::a;
void* pb = &test_type::b;
void* pc = &test_type::c;
void* pd = &test_type::d;
void main()
{
std::cout << "Relative address of member 'a' " << (int)pa << std::endl;
std::cout << "Relative address of member 'b' " << (int)pb << std::endl;
std::cout << "Relative address of member 'c' " << (int)pc << std::endl;
std::cout << "Relative address of member 'd' " << (int)pd << std::endl;
}
据我所知,它也与msvc和gcc合作。
答案 6 :(得分:0)
Mick - 为了做你想做的事(复制/测试),你只需要
向test_type类添加构造函数以及非构造函数init_from_globals()(其代码逐个复制4个值,数组在循环中或通过memcopy复制)。
添加“diff_from_globals()”方法,再次区分4个成员
就实现而言,它的效率/优雅程度低于您想要的效果/优雅程度,但是在方法中,优雅的内容完全隐藏在代码的其余部分中:)
答案 7 :(得分:0)
我认为人们忽略了这一点。假设任何布局总是危险的,因为这可能会从CPU变为CPU,编译器再到编译器甚至优化程度。
C ++将生成一个默认的副本分配函数,就像你写了这个:
class test_type
{
int a;
char b;
float c[10];
double d[3];
public:
test_type &operator=(const test_type &other)
{
// copy all of the members one by one.
}
}
唯一需要注意的是默认运算符只复制成员并包含指针。如果您已动态分配附加到指针的内容,则必须在运算符中明确地处理新的内存分配和数据复制。