Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量在内存中的存储_C++_Memory Management - Fatal编程技术网

C++ 变量在内存中的存储

C++ 变量在内存中的存储,c++,memory-management,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]; } 是否保证内存中所有变量的排列是相同的。i、 e.是否保证在全局列表和类列表中,将“b”存储在“a”之后 编辑:我之所以这样问,是因为我想A)将数据作为“工作批次”从一个复制到另一个,B)我想作

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

int a;
char b;
float c[10];
double d[3];
我在一个类中列出了一系列相同的变量

class test_type
{
    int a;
    char b;
    float c[10];
    double d[3];
}
是否保证内存中所有变量的排列是相同的。i、 e.是否保证在全局列表和类列表中,将“b”存储在“a”之后


编辑:我之所以这样问,是因为我想A)将数据作为“工作批次”从一个复制到另一个,B)我想作为工作批次检查它们之间的任何差异。如果对主要问题的回答是“否”,那么有人对我如何解决这个问题有任何建议,最好是尽可能地保留现有代码。

< P>不。我不认为C++标准保证了全局变量的内存布局。

< P>内存分配是编译器依赖的。因此,无法保证连续分配,或全局变量和类成员变量的相同分配。

不,您不能依赖于此。如何为变量分配内存取决于编译器。

不,不保证。根据您希望执行的操作,可以使用指向成员运算符的指针来确保您知道成员变量的相对地址

所以在你们班上:

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;
}
类测试类型
{
INTA;
字符b;
浮点数c[10];
双d[3];
}
void*pa=&测试类型::a;
void*pb=&测试类型::b;
void*pc=&测试类型::c;
void*pd=&测试类型::d;
void main()
{

std::coutC/C++标准不要求变量按照声明的顺序存储。因此编译器可以自由地按照他们想要的顺序存储变量。但是可以保证它们将按照声明的顺序初始化。对于全局变量和类成员变量都是如此


关于全局变量的一些注意事项:在编译单元中,它们将按指定的顺序初始化,但这一保证不适用于编译单元。

Mick-为了完成您想要的(复制/测试),您只需

  • 添加一个构造函数来测试_type类,以及一个来自_globals()的非构造函数init_(其代码逐个复制4个值,在循环中或通过memcopy复制数组)

  • 添加一个“diff_from_globals()”方法,该方法再次分别区分4个成员


就实现而言,它的效率/优雅程度比您想要的要低一些,但是在一个方法中,优雅程度完全隐藏在代码的其余部分中:)

为什么不简单地使用一个类型为test\u类型的全局对象,而不是定义多个全局变量

class test_type
{
    int a;
    char b;
    float c[10];
    double d[3];
};

test_type global;

现在,用“全局”的副本初始化一个新的测试类型对象是小菜一碟。

我认为人们忽略了这一点。假设任何布局都是危险的,因为这可能会随着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.
    }
}

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

这是因为类/结构中定义的变量顺序最为复杂tainly是有保证的。只有全局变量不是。也许你是对的,但我的解决方案并不意味着任何额外的操作,通常说它不依赖于一个可以通过实现轻松更改的原则。(我不完全确定这对对齐问题有何影响…)你的“解决方案”演示了一些已知的事实。它不能解决OP的目标,即将全局变量复制到一个具有单个操作的结构中。结构的布局(除了对齐)不是依赖于实现的。我没有ANSI C或C++规范的拷贝,但这里是K&R必须说的(第二版,P 213):“一个结构的成员的地址按照其声明的顺序递增。”这实际上保证了一些东西。使用相同的访问说明符连续声明的类/结构元素的顺序被保留。虽然可能会涉及一些填充。是的,但Jesper说“全局变量”“.So?在这种情况下,隐式生成的赋值运算符没有害处。当然没有。我认为创建默认运算符正确工作的类是一种好的做法。例如,我使用std::string而不是char*。