問題描述
這是一道在線C++試題,已經做完了.
This is an online C++ test question, which has been done.
#include<iostream>
using namespace std;
class A
{
};
class B
{
int i;
};
class C
{
void foo();
};
class D
{
virtual void foo();
};
class E
{
int i ;
virtual void foo();
};
class F
{
int i;
void foo();
};
class G
{
void foo();
int i;
void foo1();
};
class H
{
int i ;
virtual void foo();
virtual void foo1();
};
int main()
{
cout <<"sizeof(class A) : " << sizeof(A) << endl ;
cout <<"sizeof(class B) adding the member int i : " << sizeof(B) << endl ;
cout <<"sizeof(class C) adding the member void foo() : " << sizeof(C) << endl ;
cout <<"sizeof(class D) after making foo virtual : " << sizeof(D) << endl ;
cout <<"sizeof(class E) after adding foo virtual , int : " << sizeof(E) << endl ;
cout <<"sizeof(class F) after adding foo , int : " << sizeof(F) << endl ;
cout <<"sizeof(class G) after adding foo , int : " << sizeof(G) << endl ;
G g;
cout <<"sizeof(class G) after adding foo , int : " << sizeof(g) << endl ;
cout <<"sizeof(class H) after adding int 2 virtual " << sizeof(H) << endl ;
return 0;
}
輸出:
sizeof(class A) : 1
sizeof(class B) adding the member int i : 4
sizeof(class C) adding the member void foo() : 1
sizeof(class D) after making foo virtual : 8
sizeof(class E) after adding foo virtual , int : 16
sizeof(class F) after adding foo , int : 4
sizeof(class G) after adding foo , unsigned int : 4
sizeof(class g) after adding foo , unsigned int : 4
sizeof(class H) after adding int 2 virtual 16
我的問題:
為什么 siszeof(A)
是 1 而 sizeof(C)
也是 1?
Why siszeof(A)
is 1 and sizeof(C)
is 1 too ?
為什么 siszeof(H)
是 16 而 sizeof(G)
是 4 ?
Why siszeof(H)
is 16 but sizeof(G)
is 4 ?
為什么 siszeof(E)
是 16 而 sizeof(F)
是 4 ?
Why siszeof(E)
is 16 but sizeof(F)
is 4 ?
為什么 siszeof(D)
是 8 而 sizeof(E)
是 16 ?
Why siszeof(D)
is 8 but sizeof(E)
is 16 ?
我的猜測:
虛函數是一個8字節的指針.但是,我不知道為什么 E
大小是 16 ?向空類添加函數不會改變其大小?
A virtual function is a pointer with 8 bytes.
But, I do not know why E
size is 16 ?
Adding a function to an empty class does not change its size ?
感謝任何幫助.
謝謝
推薦答案
首先,虛函數不是一個 8 字節的指針.在 C++ 中,只有 sizeof(char)
保證是任意數量的字節.
First off, a virtual function is not a pointer with 8 bytes. In C++ nothing but sizeof(char)
is guaranteed to be any number of bytes.
第二,只有類中的第一個虛函數會增加其大小(依賴于編譯器,但在大多數情況下 - 如果不是全部 - 就像這樣).所有后續方法都沒有.非虛函數不影響類的大小.
Second, only the first virtual function in a class increases its size (compiler-dependent, but on most - if not all - it's like this). All subsequent methods do not. Non-virtual functions do not affect the class's size.
發生這種情況是因為類實例不保存指向方法本身的指針,而是指向虛擬函數表,每個類一個.
This happens because a class instance doesn't hold pointers to methods themselves, but to a virtual function table, which is one per class.
如果你有:
class A
{
virtual void foo();
}
和
class B
{
virtual void goo();
virtual void test();
static void m();
void x();
}
你會有 sizeof(A) == sizeof(B)
.
現在:
為什么 siszeof(A) 是 1 而 sizeof(C) 也是 1?
Why siszeof(A) is 1 and sizeof(C) is 1 too ?
A
和 C
的大小為 1 只是因為不允許類的大小為 0.函數與它無關.這只是一個虛擬字節.
A
and C
have size 1 just because it's not allowed for a class to be of size 0. The functions have nothing to do with it. It's just a dummy byte.
為什么 siszeof(H) 是 16 而 sizeof(G) 是 4 ?
Why siszeof(H) is 16 but sizeof(G) is 4 ?
G
只有一個成員占內存 - int
.在你的平臺上,sizeof(int) == 4
.H
,除了int
,還有一個指向vftable
(虛函數表,見上)的指針.this 的大小、int 的大小和對齊方式是特定于編譯器的.
G
has only one member that accounts for memory - the int
. And on your platform, sizeof(int) == 4
. H
, besides the int
, also has a pointer to the vftable
(virtual function table, see above). The size of this, size of int and allignment are compiler specific.
為什么 siszeof(E) 是 16 而 sizeof(F) 是 4 ?
Why siszeof(E) is 16 but sizeof(F) is 4 ?
上面解釋了 - 非虛方法不占用類中的內存.
Explained above - non virtual methods don't take up memory in the class.
為什么 siszeof(D) 是 8 而 sizeof(E) 是 16 ?
Why siszeof(D) is 8 but sizeof(E) is 16 ?
D
僅包含 vftable
指針,它在您的平臺上顯然是 8 個字節.E
也有一個 int,vftable
對齊到 8 個字節.所以它是這樣的:
D
only contains the vftable
pointer which is apparently 8 bytes on your platform. E
also has an int, and the vftable
is aligned to 8 bytes. So it's something like:
class E
4 bytes for int | 4 padding bytes | 8 bytes for vftable pointer |
| x | x | x | x | | | | | v | v | v | v | v | v | v | v |
這篇關于C++ 中帶有 int 、函數、虛函數的 sizeof 類?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!