程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++內存對齊技術學習

C++內存對齊技術學習

編輯:C++入門知識

今天學到C++ 結構體中內存對齊的技術,因此晚上搜索下全面整理了下內存對齊相關的知識。

一、內存對齊的原因大部分的參考資料都是如是說的:

1、平台原因(移植原因):不是所有的硬件平台都能訪問任意地址上的任意數據的;某些硬件平台只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
2、性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。

二、對齊規則每個特定平台上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的“對齊系數”。

規則:
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
3、結合1、2顆推斷:當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。 union C++共用體聲明如下:
union 共用體名
{    數據類型 成員名;   
數據類型 成員名;   
...    } 變量名;
struct C++ 結構體 [template-spec] struct [ms-decl-spec] [tag [: base-list ]] {
member-list }
[declarators];
[struct] tag declarators;
union UA { int a[3];
//20 short b;
//2 double c;
//8 char p2;
//1 };
union UA1 {
 int b;
//2 double c;
//8 short p2;
//1 };
typedef struct UB1 { int i;
//4 double x;
//8 short j;
//4 };
struct UB { int n;
// 4字節 UA a;
// 24字節 char c[10];
// 10字節 };
class A
{ public: A(){};
 ~A(){};
UB1 B;
char *p;
};
int main ()
{ std::cout<<"UB1 size"<

 


摘自 swrd

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved