gpt4 book ai didi

c++ - 为什么动态创建的对象的位数是对象大小的两倍?

转载 作者:太空狗 更新时间:2023-10-29 19:43:19 24 4
gpt4 key购买 nike

我编写了代码来创建动态创建对象的链表:

#include <iostream>
using namespace std;

struct X {
int i;
X* x;
};

void birth(X* head, int quant){
X* x = head;
for(int i=0;i<quant-1;i++){
x->i = i+1;
x->x = new X;
x = x->x;
}
x->i = quant;
x->x = 0;
}

void kill(X* x){
X* next;
while(1==1){
cout << x->i << endl;
cout << (long)x << endl;
next = x->x;
delete x;
if(next == 0){
break;
} else {
x = next;
}
}
}

int main(){
cout << (long)sizeof(X) << endl;
X* x = new X;
birth(x, 10);
kill(x);
return 0;
}

这似乎是可行的,除了当您查看每个对象的地址时...

16
1
38768656
2
38768688
3
38768720
4
38768752
5
38768784
6
38768816
7
38768848
8
38768880
9
38768912
10
38768944

尽管 X 的大小只有 16 位,但它们似乎是相隔 32 位创建的。我创建对象的方式是否存在问题,或者这仅仅是动态分配工作方式的结果?

最佳答案

原因在C Standard7.22.3 内存管理函数中有说明。 :

The order and contiguity of storage allocated by successive calls to the aligned_alloc, calloc, malloc, and realloc functions is unspecified. The pointer returned if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object with a fundamental alignment requirement and then used to access such an object or an array of such objects in the space allocated

由于内存必须“适当对齐,以便可以将其分配给具有基本对齐要求的任何类型对象的指针”,malloc et al 倾向于从不同的、依赖于平台的倍数开始——通常是 8 或 16 字节边界。

而且因为 new 通常用 malloc 实现,这也适用于 C++ new

关于c++ - 为什么动态创建的对象的位数是对象大小的两倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com