簡體   English   中英

std::vector 的 C++ struct 內存布局

[英]C++ struct memory layout for std::vector

對於下面的結構體,由於 v 是一個動態分配的對象,內存對齊如何工作? struct S的大小是否恆定,即使 v 的大小不變? 那么 v 本質上是作為一個指針(或某種指針的包裝器)工作的嗎?

struct S {
    ANY_TYPE a;
    std::vector<ANY_TYPE> v;
} s;

如果以上所有問題的答案都是肯定的,那么隨着 v 的大小變化,其成員的內存存儲在哪里? 這些被認為是堆內存還是堆棧內存?

編輯:我看到對這個問題的反對票,並意識到我應該對 std::vector 本身進行更多研究。 我讀了這篇文章,它使一切變得清晰。 謝謝你的回答!

v不是動態分配的。 std::vector本身是S對象的一部分。 但是, v確實擁有一個動態分配的緩沖區。

這意味着sizeof(S)是常數。 它總是sizeof(ANY_TYPE) + sizeof(std::vector<ANY_TYPE>) + padding

本質上, S將在內存中以這樣的方式排列(可能在av之間有一些填充以保持對齊):

  S
+---+
|   |
| a |
|   |
+---+
|   |
| v |    dynamically allocated buffer
|   |  +------+------+-----+
| +----> v[0] | v[1] | ... |
|   |  +------+------+-----+
+---+

v絕對是至少一個指針和(取決於實現)其他一些記帳的包裝器。 v的棧上(或數組內)足跡將僅限於直接在std::vector類中聲明的那些成員,是的,這意味着v的大小,以及S實例的大小,將是恆定的。

代表v (和S實例)消耗的字節數將取決於v在其構造和生命周期過程中分配了多少內存。

用於 S 的直接成員(包括v )的內存由執行聲明的代碼決定:

void my_func() {
    S s1;          // `s1` and its members `a` and `v` are all on the stack
                   //  ...though `v` will allocate heap memory for its own use
    S* s2 = new S; // `s2` points to a heap-allocated instance of `S` 

暫無
暫無

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

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