我正在存储和生成一些自然用维度>表示的数据。 1.但是,我看到许多答案建议程序员使用带有自己的自定义索引的1D向量来表示多维度。我的问题是:只使用1维度可以获得什么?
在我当前的项目中,性能是一个优先级(我首先知道代码,然后是配置文件,但是为了速度,这个项目正在从另一种语言导入到C ++中)。我可以看到只有一个矢量对象可以减少开销,但它是否比频繁计算索引更多?我看到一个答案提到使用嵌套向量:
vector < vector<int> >
对new
进行大量调用。我能看出这是多么令人不安,这是真的吗?
答案 0 :(得分:4)
首先,std::vector<std::vector<int>>
可以有不同大小的内部向量。但是,我假设您正在专门讨论使用此类型来模拟2D数组。假设您在创建向量时设置了向量的大小,您可能不需要担心动态分配的数量,因为它们都是一次性发生的。
向量在内部分配其元素的数组。因此外部向量分配一个向量数组,每个内部向量分配一个int
s数组。你可以这样想:
┌─────┐
│ vec │
└──╂──┘
┃
▼
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ vec │ vec │ vec │ vec │ vec │ vec │ vec │ vec │ vec │
└──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┘
┃ ┗━━━━━━━━━━┓
▼ ▼
┌─────┬─────┬┄ ┌─────┬─────┬┄
│ int │ int │ │ int │ int │
└─────┴─────┴┄ └─────┴─────┴┄
如您所见,int
的数组完全相互独立。它们可能处于完全不同的记忆位置。这称为碎片。它们几乎肯定不会在一个连续的内存块中。因此,访问2D矢量的不同“行”中的元素可能会导致缓存未命中。
但是,如果你分配一个int
s的矢量并进行自己的二维索引,你的内存布局更像是这样:
┌─────┐
│ vec │
└──╂──┘
┃
▼
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬┄
│ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴┄
int
现在存储在单个连续的内存块中。任何访问都可能具有类似的内存地址并导致缓存命中。这可能会为您带来性能提升。