同一個結構體,為什麼在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 |