在内存中存储变量

时间:2009-09-24 11:58:36

标签: c++ memory-management

如果我有一个像这样的全局变量列表......

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)我想检查它们之间的任何差异作为工作批次。如果主要问题的答案是“否”,那么是否有人对如何解决问题有任何建议,最好尽可能保持现有代码不变。

8 个答案:

答案 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.
    }
}

唯一需要注意的是默认运算符只复制成员并包含指针。如果您已动态分配附加到指针的内容,则必须在运算符中明确地处理新的内存分配和数据复制。