在C ++中使用这个简单的代码:
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class Empty{};
int main() {
array<unique_ptr<Empty>, 1024> empties;
for(size_t i =0; i < 1024; i++){
empties[i] = make_unique<Empty>();
}
for(auto& element : empties){
cout << "ptr: " << element.get() << endl;
}
return 0;
}
在ideone.com或Windows中运行时,我们得到以下结果:
ptr: 0x2b601f0c9ca0
ptr: 0x2b601f0c9cc0
ptr: 0x2b601f0c9ce0
ptr: 0x2b601f0c9d00
ptr: 0x2b601f0c9d20
ptr: 0x2b601f0c9d40
ptr: 0x2b601f0c9d60 ...
对我而言,这很奇怪。操作系统或标准库中的哪种分配算法可能会导致在地址上没有分配,以不同于0的数字结束?
我做这个实验的原因是,鉴于操作系统使用伙伴算法,管理页面和分配请求将导致操作系统分配一块连续内存,然后进行几次下一次分配(直到耗尽已分配的内存)应该分配到附近。如果是这种情况,那么在某些情况下,列表的缓存问题可能不会那么重要,但我得到的结果是我没想到的。
分配节点右侧的第二个数字也是随机的。什么可能导致这种行为?
答案 0 :(得分:-1)
如果我没记错的话,C ++中类的最小大小是一个字节。由于类之间存在一致的32字节间距,因此可能恰好是您所创建的空类的大小。要确定这一点,请尝试添加
std::cout << "Empty class size: " << sizeof(Empty) << std::endl;
它可能不会是32个字节,相反,每个对象之间可能会有一些一致的间距。
注意: 这是否为您编译。它对我来说并不适用,因为空间不能被隐式初始化。
答案 1 :(得分:-2)
请注意,打印的指针不准确,操作系统允许您将它们视为后续指针,因为它们可以分配到完全不同的页面。