[英]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
將在內存中以這樣的方式排列(可能在a
和v
之間有一些填充以保持對齊):
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.