簡體   English   中英

對象數據成員的C ++連續內存訪問

[英]C++ Contiguous memory access for object data members

我很好奇內存模型如何用於C ++類。 具體來說,是否可以保證對象的數據成員是連續分配的。 例如,如果我有以下代碼:

class Particle {
public:
  Particle(double ix, double iy, double ivx, double ivy);
  // Omitted for brevity

private:
  double x;
  double y;
  double vx;
  double vy;
};

當我初始化一個對象時,數據成員將在內存中是連續的還是我更好(為了提高性能)執行以下操作:

class Particle {
public:
  Particle(double ix, double iy, double ivx, double ivy);
  // Omitted for brevity

private:
  std::array<double, 4> params
};

我來自Fortran和C編程領域,並且習慣於使用數組進行快速順序內存訪問,因此我很好奇當所有數據成員在任何調用上連續使用時,上述語義之一是否適合快速訪問。

  • 該標准保證它們在內存中將按照該順序排列
    (如果您選擇了他們的地址,他們將會增加)。

  • 保證它們將在連續的內存中; 但是,如果那是最理想的布局,那么它們可能會是。 允許編譯器在成員之間添加填充(通常這樣做是為了提高訪問效率(犧牲速度的空間))。 如果所有成員的大小相同,這是不可能的。

注意:在它們之間引入public / private / protected會使事情變得復雜,並且可能會更改順序。

您是否最好使用數組?

那要看。 您通常會通過索引還是通過名稱訪問它們? 我會說,您擁有的第一個版本中有99%的時間更好,但是我可以想象用例中std::array<>可能有用(通過索引訪問成員)。

在評論中建議使用std::vector<> 這是正確的,並且標准保證成員位於相鄰位置,但它們可能不在對象本地(在std::array<>它們對於對象本地)。

是的,可以保證順序與[class.mem] .19中的聲明相同

分配具有相同訪問控制的(非聯盟)類的非靜態數據成員,以便以后的成員在類對象中具有更高的地址 未指定具有不同訪問控制的非靜態數據成員的分配順序。 實施一致性要求可能會導致兩個相鄰成員不能彼此立即分配; 管理虛擬功能和虛擬基類的空間要求也可能如此。

[元答案]

我的生活更好嗎?

為什么連續分配數據成員必然會提高性能? 實際上,因為類似double類的東西需要適當對齊,所以通常情況恰恰相反(這就是編譯器並不總是這樣做的原因)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM