unix/linux 位元組對齊補齊
/*
* aligned.c
*
* Created on: 2016-2-24
* Author: xfhu
*/
#include <stdio.h>
/*
* 設定屬性packed,使1位元組對齊補齊,因此sizeof(C)=10,沒有未使用的記憶體空餘
*/
typedef struct A{
char a;
double b;
char c;
}__attribute__((packed)) A;
/*
* 該作業系統預設使用4位元組對齊方式,總共為sizeof(B)=16位元組因此記憶體使用為:
* 第1位元組 :存放a
* 第2~4位元組 :因為位元組對其,未使用
* 第5~12位元組 :存放b
* 第13位元組 :存放c
* 第14~16位元組 :因為位元組對其,未使用
*/
typedef struct B{
char a;
double b;
char c;
}B;
/*
* 預處理指令,使1位元組對齊補齊,因此sizeof(C)=10,沒有未使用的記憶體空餘
*/
#pragma pack(1)
typedef struct C{
char a;
double b;
char c;
}C;
/*
* 恢復預設對齊補齊方式
*/
#pragma pack()
typedef struct D{
char a;
double b;
char c;
}D;
/*
* 設定內部位元組對齊補齊,即如果E 不足32位元組,則因為對齊補齊,會分配32位元組,以至於E是32位元組對齊補齊。
*/
typedef struct E{
char a;
double b;
char c;
}__attribute__((aligned(32))) E;
int main(int argc,char** argv){
printf("sizeof char=%d\n",sizeof(char));
printf("sizeof double=%d\n",sizeof(double));
printf("sizeof int=%d\n",sizeof(int));
printf("sizeof A=%d\n",sizeof(A)); // 10
printf("sizeof B=%d\n",sizeof(B)); // 16
printf("sizeof C=%d\n",sizeof(C)); // 10
printf("sizeof D=%d\n",sizeof(D)); // 16
printf("sizeof E=%d\n",sizeof(E)); // 32
return 0;
}
相關推薦
unix/linux 位元組對齊補齊
/* * aligned.c * * Created on: 2016-2-24 * Author: xfhu */ #include <stdio.h> /*
Linux 位元組對齊問題
今天寫一個小程式,需要使用msg在兩個不同程式間進行通訊; 兩個程式中msg的文字結構體都是一樣的,直接複製過去的,結果執行的時候出現錯誤:msgrcv: Argument list too long 這個錯誤的原因是 msgrcv 中的引數msglen 小於訊息佇列裡要讀
linux和windows gcc g++ vc編譯器位元組對齊
首先可以肯定的說,肯定和編譯器有關,vc編譯器和gcc,g++編譯器肯定不一樣,不說明是什麼編譯器什麼系統下問你結構體長度就是在耍流氓。 (1)vc編譯器下結構體成員首地址地址必須被該結構體成員長度整除,打個比方,double a的首地址如果為0x06, 那是不行的,再填2
Thinking In Linux C/C++位元組對齊詳解
一.什麼是位元組對齊,為什麼要對齊? 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個接一
unix/linux "資料的對齊" "指標的對齊"
"資料的的對齊" 以下內容節選自《Intel Architecture 32 Manual》。 字,雙字,和四字在自然邊界上不需要在記憶體中對齊。(對字,雙字,和四字來說,自然邊界分別是偶數地址,可以被4整除的地址,和可以被8整除的地址。) 無論如何,為了
學習筆記 linux 結構體位元組對齊
網路位元組序傳傳輸的,結構體要用一位元組對齊,否則會因為預設對齊方式而造成程式資料異常,如下圖結構體,預設對齊方式下,結構體長度為2+2+2+2=8;一位元組對齊方式下,結構體長度為1+2+2+2=7 #pragma pack(1) typedef struc
C/C++位元組對齊問題總結
原文連結:http://blog.csdn.net/yangtalent1206/article/details/6890624 根據以下資料,自己在兩
18 11 05 繼續補齊對python中的class不熟悉的地方 和 pygame 精靈
---恢復內容開始--- class game : #歷史最高分----- 是定義類的屬性 top_score =0 def __init__(self, player_name) : #是定義的例項屬性 每個例項都要有他的格式
【C語言】位元組對齊問題(以32位系統為例)
1. 什麼是對齊? 現代計算機中記憶體空間都是按照位元組(byte)劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體地址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序地一個接一個地排放,這就是對齊
轉存下位元組對齊
(1)什麼是位元組對齊 一個變數佔用 n 個位元組,則該變數的起始地址必須能夠被 n 整除,即: 每個變數的起始存放地址 % n = 0, 對
C語言 結構體位元組對齊問題
摘選自這位大神的部落格 方法一: 結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。原則1 資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整
記憶體對齊和補齊
對齊:是針對單個成員變數的; 補齊:是針對擺放的所有成員變數的整體而言要對齊; //4位元組的對齊粒度 #pragma pack(4) // #pragma pack(n) /* n = 1,
NDK開發armeabi下位元組對齊問題
本人使用Android studio進行NDK開發,模擬器測試沒問題,真機測試出現bug: Fatal signal 7 (SIGBUS), code 1, fault addr 0x86a16861 in tid 18277 (Thread-3484) 原因:預設位元組對齊方式下訪問flo
詳解結構體、類等記憶體位元組對齊
先說個題外話:早些年我學C程式設計時,寫過一段解釋硬碟MBR分割槽表的程式碼,對著磁碟編輯器怎麼看,怎麼對,可一執行,結果就錯了。當時除錯也不太會,又根本沒聽過結構體對齊這一說,所以,問題解決不了,好幾天都十分糾結。後來萬般無奈請教一個朋友,才獲悉可能是結構體對齊的事,一查、一改,果真如此。 &
結構體的位元組對齊
在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。 1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除; 2) 結構體每個成員相對結構體首地址的偏移量都是成員大小的整數倍; 3) 結構體的總大小為結構
C 構造型別 陣列、列舉、聯合體、結構體(位段) 位元組對齊 和 大小端儲存
列舉 .列舉:被命名的標籤常量(對事物的列出) ---型別的構造------- enum key{ UP, //成員<標籤常量:預設第一個為0 後一個總是前一個的值加一> DOWN, L
位元組對齊的概念
一、概念 對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。 二、為什麼要位元組對齊
C語言位元組對齊問題詳解
部落格園 首頁 新隨筆 聯絡 管理 訂閱 隨筆- 80 文章- 0 評論- 125 引言 考慮下面的結構體定義: 1 typedef struct{ 2 char c1; 3 short s; 4
C語言位元組對齊及設定編譯對齊方式方法
一、概念 對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。 二、為什麼要位元組對齊 需要位
嵌入式C語言的位元組對齊理解(圖文)
1.位元組對齊? 對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於系統長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。 2. 計算機為什麼要對齊? 需