生活随笔
收集整理的這篇文章主要介紹了
内存字节对齐问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天看到一個求結構體偏移量的題目,可以使用宏來求解,覺得很是新奇,繼續深入考慮到結構體字節對齊問題。參考網上的內容,對齊的規則有如下兩條:
第一個數據成員從offset=0的地址開始放,以后的數據成員存放的起始位置要么為本數據大小的整數倍要么為其體內所含子成員大小的整數倍。結構體的sizeof得到的大小肯定為其內部最大成員的大小的整數倍;網上有說結構體內有子結構體時,子結構體的開始位置應該為其內部最大數據成員大小的整數倍,經實驗,不符合此條。同時可以使用#pragma pack(n),來改變對齊的大小,一般都設置為1,2,4。默認的值和機器字長有關。 1 #include <
string>
2 #include <iostream>
3 //#pragma pack(1)
4 #define FIND(type, member) (size_t)&(((type*)0)->member)
5 using namespace std;
6 struct aa{
7 int a;
8 char b;
9 double c;
10 };
11
12 struct Node{
13 char a;
14 int ia;
15 double da;
16 char b;
17 char c;
18 aa sa;
19 };
20 int main(
int argc,
char*
argv[]){
21 cout << FIND(
struct Node, a) <<
endl;
22 cout << FIND(
struct Node, ia)<<
endl;
23
24 cout << FIND(
struct Node, da)<<
endl;
25 cout << FIND(
struct Node, b)<<
endl;
26 cout << FIND(
struct Node, c)<<
endl;
27 cout <<
"sa" << FIND(
struct Node, sa)<<
endl;
28 cout <<
"sizeof(double):" <<
sizeof(
double) <<
endl;
29 cout <<
"sizeof(aa):" <<
sizeof(aa) <<
endl;
30 cout <<
"sizeof(Node):" <<
sizeof(Node) <<
endl;
31
32 cout <<
"---------------------------------------";
33 Node *p =
new Node;
34 cout <<
"&p:" << (
int*)p <<
endl;
35 cout <<
"&p->a:" <<(
int*)&(p->ia) <<
endl;
36
37 }
?
?
轉載于:https://www.cnblogs.com/wyqx/p/3346364.html
總結
以上是生活随笔為你收集整理的内存字节对齐问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。