標籤:

同一個結構體,為什麼在windows下和ubuntu下大小不一樣?

在看《Redis設計與實現》時,涉及到redisObject大小的時候實測了一把,在windows下使用visual studio 2015 測試結果是12;在ubuntu下使用g++ 測試結果為16。請問造成這兩種不同結果的原因是什麼,又是怎麼算出來的呢?謝謝!

// test.cpp : 定義控制台應用程序的入口點。
//

#include &
using namespace std;
typedef struct redisObject {
unsigned type : 4;
unsigned encoding : 4;
unsigned lru : 24; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;
int main()
{
cout &<&< sizeof(robj) &<&< endl; return 0; }


因為Visual Studio 2015默認的編譯目標是x86,所以指針的大小是4。前面三個的位域大小加起來是32位,也就是一個4個Byte,再加上一個int的4個Byte,加上32位機器指針的4個Byte,於是就是12了,若是你把編譯目標改為x64,結果就是16 了。

我想你的Linux OS應該也是64 Bits的,GCC的編譯目標大小也是64 Bits的。


cout &<&< sizeof(int) &<&< endl;

cout &<&< sizeof(void*) &<&< endl;

你看看這兩句輸出什麼就知道了。

還有Visual C++默認輸出是Win32吧,如果你改成X64的話結果也應該不一樣。


2*sizeof(int) + sizeof(void*) =?

int不用說就是4位元組,問題在於指針的內存尺寸。32位系統是4位元組,64位系統是8位元組。

所以vs肯定是32位系統下的,常識而已。


推薦閱讀:

有些語言用{},有些語言用end,大家怎麼看?
我寫C++喜歡用繼承有問題么?
我們用的計算機語言底層都是用什麼寫的?
C++中左值、右值與寄存器的關係是怎樣的?
0基礎自學c++到找到一份開發工作?

TAG:CC |