[英]What exactly is an 'aligned pointer'?
有人能告訴我對齊的指針實際上意味着什么嗎?
這意味着所指向的地址可以被某個因子整除。
有時使用術語“自然對齊”,這通常意味着具有自然對齊的對象需要放置在可被對象大小均勻整除的地址處。
對齊有時非常重要,因為許多與硬件相關的事情對這種對齊設置了限制。
例如,在經典的SPARC體系結構上(我認為也是在經典的ARM 上),您不能從奇數地址讀取大於一個字節的整數。 嘗試這樣做會立即因總線錯誤而停止您的程序。 在 x86 架構上,CPU 硬件會處理該問題(根據需要對緩存和/或內存進行多次訪問),盡管這可能需要更長的時間。 RISC:ier 架構通常不會為你做這件事。
諸如此類的事情也會影響填充,即在例如結構字段之間插入虛擬數據以保持對齊。 像這樣的結構:
struct example
{
char initial;
double coolness;
};
很可能最終會在字段之間填充 7 個字節,以使double
字段對齊可被其自身大小整除的偏移量(我假設為 8)。
當以二進制方式查看時,與n字節對齊的地址將其 log2( n ) 最低有效位設置為零。 例如,需要 32 字節對齊的對象將具有以(二進制)00000 結尾的正確對齊地址,因為 log2(32) 是 5。這也意味着可以通過清除所需數字來強制地址對齊位。
為了補充unwind所解釋的內容,這是我最近在賦值中使用的一個struct
:
struct infosale {
int noseq;
char salesman[30];
char product[11];
int count;
};
您可能期望此struct
的大小為 (4+30+11+4=) 49
個字節,但實際上與sizeof
相比為52
個字節。 因為noseq
是4
個字節 + salesman
是32
個字節(對齊)+ product
是12
個字節(對齊)並且count
是4
個字節,因此是52
個字節。
取決於上下文,但它可能是指針本身被對齊,或者它指向的東西是對齊的。
“對齊”意味着某個對象存儲在某個地址是某個常量的倍數。 例如,對於 32 位整數,這幾乎總是 4。這是因為一個字節是 8 位:4*8 = 32 位。 如果對象存儲在對齊的地址中,處理器通常可以進行更快的內存訪問,或者對於某些處理器,甚至不可能進行未對齊的訪問。
它是一個指向“對齊”地址的指針。 對齊的意思是地址是某個值的倍數 - 通常是它將指向的任何類型的事物的大小(如果是原始類型),或者需要這種對齊的某些數據成員的大小。
通常你不必擔心這個; 內存分配函數將確保它們給你的內存正確對齊。 當您開始使用指針強制轉換做不安全的事情時,您就開始擔心對齊問題。
正如人們在我之前提到的那樣,這意味着您的指針可以被一定數量的字節整除。
要檢查您的指針是否對齊,您可以執行以下操作:
isaligned = !( (long)pointer % bytes );
現在,如果“指針”與“字節”字節對齊,則“isaligned”為真。
對齊指針意味着可以通過添加常量及其倍數來訪問具有相鄰內存位置的指針
對於char a[5] = "12345";
這里a
是常量指針,如果您每次可以訪問下一個字符時以及字符的大小,
a
+ sizeofchar將訪問2
a
+( sizeofchar*2 ) 將訪問3
等等
同樣,如果您逐位訪問變量值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.