g++可能通過__attribute__ ((aligned (n)))來設定變數的位元組對齊數,如
[cpp]view plain
copy
float
a __attribute__ ((aligned (16)));
就可以設定變數a按16位元組對齊。
也可以將這個屬性用於類及其成員變數
[cpp]view plain
copy
class
a
inta;
}__attribute__ ((aligned (16)));
這時類a的物件按照16位元組對齊,但是你會發現成員變數a的位址並不是16位元組對齊的,這是因為類的記憶體會儲存虛表位址,這樣a的位址會偏移4個位元組(具體偏移大小根據平台可能會有所不同)。
但是,有很多情況是需要某個變數16位元組對齊的,例如用sse加速時,就要求變數是16位元組的。這時該怎麼辦呢。g++可以針對類的成員設定位元組對齊,例如
[cpp]view plain
copy
class
test
void
hehe(){};
virtual
float
* getdata()
virtual
float
* getbdata()
protected
: float
a __attribute__ ((aligned (16)));
float
b[4];
};
這時a的位址是16位元組對齊,但b的位址不是對齊的。這樣設定還有乙個***就是類的物件的位址也會16位元組對齊。
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...
位元組對齊 8位元組對齊
參考博文 參考1 參考2 參考3 在記憶體管理中經常使用位元組對齊來管理分配的記憶體。1 原理 2 演算法 2.1unsigned intcalc align unsigned int n,unsigned align 2.2 更好的演算法 unsigned intcalc align unsign...