sizeof與記憶體對齊

2021-07-30 23:00:46 字數 1971 閱讀 4783

記憶體對齊三原則:

第乙個資料從0開始,以後每個資料要從他本身大小的整數倍開始存;

如果這個資料是個結構體或者陣列,則從其最大元素的整數倍開始存;

最後收尾要是最大成員的整數倍,不足補齊;

對齊方式(變數存放的起始位址相對於結構的起始位址的偏移量)

char

偏移量必須為sizeof(char)即1的倍數

int

偏移量必須為sizeof(int)即4的倍數

float

偏移量必須為sizeof(float)即4的倍數

double

偏移量必須為sizeof(double)即8的倍數

short

偏移量必須為sizeof(short)即2的倍數

typedef

struct bb

bb;typedef

struct aa

aa;

sizeof結果分別是24和48

加入#pragma pack

加上#pragma pack(n)後,對齊時就選擇n和資料大小兩者中最小的那個作為對齊的規則,條件三也不需要了。

sizeof與strlen的區別

int h = sizeof("abcde");

int t = strlen("abcde");

其中,h為6,t為5.

sizeof計算字串與指標

string s = "hellohwc";  

char * s1 = "hellohwc";

char s2 = "hellohwc";

char s3[100];

char* s4=(char*)malloc(100);

void *s5=(void*)malloc(100);

cout

<<<<<<0;

輸出:32(?)、4、9、100、4、4

sizeof計算類

#include "stdafx.h"  

#include

#include

using namespace std;

class emptyclass1

~emptyclass1(){}

};

class emptyclass2

virtual ~emptyclass2(){}

};

class hwcbase

virtual ~hwcbase(){}

private:

intbase;

};

class hwcsubfirst:hwcbase

~hwcsubfirst(){}

private:

int sub;

};

class hwcsubsecond:hwcbase

~hwcsubsecond(){}

private:

int sub;

char sub2;

};

int _tmain(int argc, _tchar* argv)

輸出:1、4、8、12、16

sizeof中的表示式不會被計算

int i;

i = 10;

printf("%d\n", i);

printf("%d\n", sizeof(i++));

printf("%d\n", i);

輸出結果為10,4,10

記憶體中的資料對齊與sizeof函式

之所以會有資料對齊是因為訪問記憶體的硬體電路特性。位址匯流排按對齊位址訪問,以4自己對齊為例。如果想得到0x00000001開始的4個位元組內容,系統需要以0x00000000開始讀4個位元組,取後面3個,再以0x00000004開始讀4個位元組取第乙個,組合得到想要的4個位元組。這樣取數的速度就會...

位元組對齊與sizeof

本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...

sizeof 與 位元組對齊

sizeof是運算子,可用於任何變數名 型別名或常量值,當用於變數名 不是陣列名 或常量時,它不需要用圓括號。它在編譯時起作用,而不是執行時。這是初學者問得最多的乙個問題,所以這裡有必要多費點筆墨。讓我們先看乙個結構體 struct s1 問sizeof s1 等於多少聰明的你開始思考了,char佔...