1. 程式人生 > >資料結構的位元組對齊

資料結構的位元組對齊

struct student
{
char  name[5];
int   num;
short score;
}


|char|char|char|char|
|char|----|----|----|
|--------int--------|
|--short--|---------|
======================
struct student
{
int num;
char name[5];
short score;
}


|--------int--------|
|char|char|char|char|
|char|----|--short--|


=======================


struct test1
{
int a;
int b[4];
}


|--------int--------|
|--------int--------|
|--------int--------|
|--------int--------|
|--------int--------|
=======================
struct test2
{
char   a;
int    b;
double c;
bool   d;
}


|char|----|----|----|
|--------int--------|
|--------ddd--------|
|--------ddd--------|
|bool|----|----|----|


========================
struct test3
{
char a;
long b;
static long c; //靜態變數
}


sizeof(test3) = 
sizeof(a) + sizeof(b) = 8 
sizeof計算的是在棧中分配的空間的大小,而static變數是存放在全域性資料區中的,固不計算在內。


==================
union  mm
{
char a;
int  b[5];
double  c;
int  d[3];
}


==================
#include <stdio.h>
#pragma pack()




struct student
{
char  name[5];
int   num;
short score;
}


|char|char|
|char|char|
|char|----|
|---int---|
|---int---|
|--short--|


優點:
能夠更充分的利用儲存空間
缺點:
降低計算機讀資料的速度,是一種以時間換空間的方式








相關推薦

Eigen庫資料結構記憶體問題

我這裡講的是在用到開源庫Eigen中的資料結構時會出現這樣的錯誤 error C2719: 't': formal parameter with __declspec(align('16')) won't be aligned 意思就是t: 具有 __dec

解決資料結構的異常

在程式設計中可能會遇到某個類或者結構體出現異常,其中的成員變量出現錯亂、未對其的情況,這種情況一般是由於位元組未對齊造成的,可以使用以下的方法解決,在這個類或者結構體的開始加入#pragma pack

資料結構位元組

struct student {char  name[5];int   num;short score; } |char|char|char|char| |char|----|----|----| |--------int--------| |--short--|-----

C語言 結構位元組問題

摘選自這位大神的部落格 方法一: 結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。原則1  資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整

詳解結構體、類等記憶體位元組

先說個題外話:早些年我學C程式設計時,寫過一段解釋硬碟MBR分割槽表的程式碼,對著磁碟編輯器怎麼看,怎麼對,可一執行,結果就錯了。當時除錯也不太會,又根本沒聽過結構體對齊這一說,所以,問題解決不了,好幾天都十分糾結。後來萬般無奈請教一個朋友,才獲悉可能是結構體對齊的事,一查、一改,果真如此。 &

結構體的位元組

在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。 1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除; 2) 結構體每個成員相對結構體首地址的偏移量都是成員大小的整數倍; 3) 結構體的總大小為結構

C 構造型別 陣列、列舉、聯合體、結構體(位段) 位元組 和 大小端儲存

列舉 .列舉:被命名的標籤常量(對事物的列出) ---型別的構造------- enum key{    UP,                             //成員<標籤常量:預設第一個為0 後一個總是前一個的值加一>    DOWN,    L

C/C++ 結構位元組詳解

結構體的sizeof 先看一個結構體: struct S1 { char c; int i; }; 12345 structS1{charc;in

結構體與類的位元組(終極方案,簡單易懂)

先記住常用型別在32和64位的位元組 型別 32位 64位 char 1 1 int 4 4 short 2 2 float 4 4 double 8 8

C/C++結構位元組詳解

前提:為了訪問速度和效率,需要各種型別資料按照一定的規則在空間上排列; 不是所有的硬體平臺都能訪問任意地址上的任意資料的;某些硬體平臺只能在某些地址處取 某些特定型別的資料,否則丟擲硬體異常。 為了訪問未對⻬的記憶體,處理器需要作兩次記憶體訪問;⽽對⻬的記憶體訪問僅需要

C語言結構體的位元組例項【C語言筆試題】

 一、筆試題目:在一個64位的作業系統中定義如下結構體: <span style="font-family:Microsoft YaHei;font-size:12px;">struct st_task { uint16_t id; uint32

結構體為什麼要4位元組

sizeof與struct——求結構體大小的計算方法 sizeof淺析(一)——求結構體大小 這篇文章講了sizeof求結構體大小的計算方法,並給出可以套用的準則: 一、儲存變數時地址要求對齊,編譯器在編譯程式時會遵循兩條原則: (1)結構體變數

結構體和聯合體的位元組問題

為了提速之類的,在結構體和聯合體的記憶體塊中,是按照一定的規則安排的 聯合體: 聯合體的記憶體不會為了所有成員安排,而是隻取最大的成員的所需記憶體大小,每次只能使用其中一個成員。但是有一個問題: typedef union { char a; int[5] b;

結構體4位元組規則的詳解

一 四位元組對齊的規則 C++中結構體變數的儲存為什麼有個4位元組對齊的規則,這裡是假設32位機器上,CPU在讀取記憶體資料的時候4位元組對齊會取得更快的速度;這是因為:1位元組8位,4位元組正好32位,而32位機器的暫存器,地址什麼的都是32位的,正好一次處理就完成。

關於C語言位元組結構體 共用體佔用位元組數的快速計算方法總結

前幾天在做專案時,出現了一個套接字通訊的一個問題,看似客戶端和伺服器端使用的一個相同的結構體,但是就是在伺服器端不能把客戶端傳送的資料全部顯示的打印出來。查找了好久的錯誤,才發現原來兩端的結構體看似相同,但其兩端結構體佔用的位元組數是不一樣的。才導致了伺服器端不能正常的顯示

C語言結構體的位元組原則

為什麼要對齊?     現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個接一個的排放,

結構位元組筆記(Mac OS 10.9 中測試)

前言     結構體位元組對齊相關的文章網路上有很多,看了其中幾篇寫的不錯的之後,做了一點總結,僅供自己日後回憶,請網友忽略。看過眾多關於位元組對齊的博文中,寫的我認為比較好的是實驗室蘇同學(ACM大神)寫的http://c4fun.cn/blog/2014/01/11/s

結構位元組,pragma pack,__attribute__(packed)

程式編譯器對結構的儲存的特殊處理確實提高CPU儲存變數的速度,但是有時候也帶來了一些麻煩,我們也屏   蔽掉變數預設的對齊方式,自己可以設定變數的對齊方式。 例如我們設定結構體的對齊方式: struct student { int age; char c; };

更改結構體的記憶體位元組方式--經典

為什麼要對齊?     現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。     對齊的作用和原因:

影象資料每行到4位元組

【問什麼要對齊到4位元組】 bitmap檔案儲存時,在raw data資料部分,要求每一行對齊到4位元組。 例如,一副bitmap圖片,寬度是13,即每行有效畫素為50個,按照RGB24格式儲存,在bitmap檔案的raw data部分,會從影象的左下角開始逐行遍歷整幅圖