簡體   English   中英

C ++ std :: vector連續節的大小

[英]C++ Size of std::vector Contiguous Section

在一個結構中,為了最小化填充,應該將元素聲明為最大到最小,對嗎?

std :: vector在不一定是連續的部分上分配內存,對嗎?

在一個結構中,考慮填充時將std :: vector放置在該結構中時,應該考慮多少個std :: vector?

在一個結構中,為了最小化填充,應該將元素聲明為最大到最小,對嗎?

那要看。 在某些情況下,您可能正在針對緩存行為進行優化,但這不一定會導致該排序。 在大多數實現中,以這種方式進行排序將導致結構最小(填充最少),但是標准或類似方法無法保證。 1個

std :: vector在不一定是連續的部分上分配內存,對嗎?

那是不對的。 vector需要使用一個連續的部分。 參見N3936 23.3.6.1/1:

vector是支持隨機訪問迭代器的序列容器。 另外,它在末尾支持(攤銷)恆定時間插入和擦除操作。 在中間插入和擦除需要線性時間。 存儲管理是自動處理的,盡管可以提供一些提示以提高效率。 向量的元素是連續存儲的,這意味着如果vvector<T, Allocator> ,其中Tbool以外的某種類型,則它對所有0 <= n < v.size()都服從&v[n] == &v[0] + n的標識0 <= n < v.size()

在一個結構中,考慮填充時將std :: vector放置在該結構中時,應該考慮多少個std :: vector?

Vector看不到有關結構中成員的任何信息; 它只知道大小。


1考慮一個假設機器,它具有4個字節的int並且要求所有內容都對齊5個字節。 (我不知道這樣的機器,但是以這樣的機器可能的方式編寫標准)在這種情況下,結構如下:

struct X
{
    int a;
    int b;
    char c;
    char d;
};

會浪費空間,因為

struct X
{
    int a;
    char c;
    int b;
    char d;
};

將每個char存儲到未使用的 5 字節中。 這就是為什么標准未定義此實現的原因。

我認為您正在想象這樣的事情:

struct foo {
  // ...
  std::vector<T> vec;
  // ...
};

我認為您所缺少的是std::vector對象本身與其為其元素分配的內存之間的區別。 std::vector本身占用sizeof(std::vector)個字節,因此如果考慮填充,它將至少為包含在其中的結構貢獻這么多字節。

在內部, std::vector對象在存儲元素的其他位置分配一個連續的內存區域。 為了增加或減少大小, std::vector在添加或刪除元素時可能會分配不同大小的內存。 但是,這與您的問題無關,因為此內存不會增加std::vector的大小,因此也不會增加其所屬結構的大小。

暫無
暫無

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

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