1. 程式人生 > >關於移植arm程式到x86遇到的struct對齊問題

關於移植arm程式到x86遇到的struct對齊問題

簡單記錄:

1、

arm 32位 enum型別大小是1位元組

x86 enum型別是4位元組

2、

X86上

#pragma pack(push, 1)//是按1位元組對齊
typedef struct
{
    UCHAR ucA;//1
    UCHAR ucB;//1
    UCHAR ucC;//1
    long  laa;//4
    UCHAR ucD;//1
}STTEST1;
#pragma pack(pop)//

sizeof(STTEST1):8

typedef struct
{
    UCHAR ucA;//1
    UCHAR ucB;//1
    UCHAR ucC;//1
    long  laa;//4
    UCHAR ucD;//1

}__attribute__((packed)) STTEST1;//9

sizeof(STTEST1):9

“__attribute__((packed))”在arm上是可以1位元組對齊,即sizeof(STTEST1)=8

相關推薦

關於移植arm程式x86遇到的struct問題

簡單記錄: 1、 arm 32位 enum型別大小是1位元組 x86 enum型別是4位元組 2、 X86上 #pragma pack(push, 1)//是按1位元組對齊 typedef struct {     UCHAR ucA;//1     UCHAR ucB;/

微信小程式實現文字兩端

在小程式開發中經常會用到文字的兩端,比如登入的使用者名稱、密碼、驗證碼等需要讓這些文字左右對齊,下面介紹常用的對齊方式: 1.使用下面這樣,經過測試在開發工具中有效,但是在手機端測試無效,相容性不好。 .text{ text-align: justify; tex

java程式實現列印完美的楊輝三角形

前面寫過一篇可以對齊的楊輝三角列印,但是還是有很大缺陷。java列印可對齊的楊輝三角形 現在補充一篇列印楊輝三角形的完美對齊方案程式碼,而且對齊替代的字元可以隨時調整,不限於空格 對齊原理就是找出最大長度的資料,動態用字元給每個資料追加字元至最大資料長度,這樣每個資料長度都

ARM Linux中的非記憶體訪問(Alignment trap警告的原因)

ARMv5指令集的CPU(一般是arm9架構)預設不支援非對齊記憶體訪問,ARMv6及以上的CPU預設支援處理大部分的非對齊記憶體地址訪問。對齊指的是起始地址是一個word長度的整數倍,通常是4位元組對齊。 通過設定/proc/cpu/alignment檔案內容可修改核心中

關於ARM體系中棧的問題

基於ARM架構的處理器的C語言程式設計遵循ATPCS(ARM-THUMB procedure call standard)和AAPCS(ARM Application Procedure Call Standard)。ATPCS規定資料棧為FD(滿遞減Full Decrease)型別,並且對資料棧的操作是

armcm3權威指南筆記----arm程式設計中地址未方面的影響

P152當使用C開發程式時,推薦開啟CM3的雙字對齊管理機制(在NVIC配置與控制暫存器中,把STKALIGN置位),程式碼形如: #define NVIC_CCR ((volatile unsigned long *)(0xE000ED14)) *NVIC_CCR =

ARM程式由於位元組引起的問題深入分析

今天YD在移植告警模組時遇到一個很稀罕的warning,google+baidu也沒有找到結果。 warning描述如下: Warning[Pa039]: use of address of unaligned structure member ...... 對應的程式為: lstInit(&(gC

分配粒度和內存頁面大小(x86處理器平臺的分配粒度是64K,內存頁是4K,所以section都是0x1000,硬盤扇區大小是512字節,所以PE文件默認文件是0x200)

tail details lpad 硬件 512字節 地址 系統 pad 原因 分配粒度和內存頁面大小x86處理器平臺的分配粒度是64K,32位CPU的內存頁面大小是4K,64位是8K,保留內存地址空間總是要和分配粒度對齊。一個分配粒度裏包含16個內存頁面。這是個概念,具體

C語言精要總結-內存地址struct大小判斷篇

超過 等於 合規 占用 編譯 約定 long 並發 分享 在筆試時,經常會遇到結構體大小的問題,實際就是在考內存地址對齊。在實際開發中,如果一個結構體會在內存中高頻地分配創建,那麽掌握內存地址對齊規則,通過簡單地自定義對齊方式,或者調整結構體成員的順序,可以有效地減少內存使

SylixOS ARM平臺下的內存訪問

硬件 一個 空間 不同 我們 宏定義 順序 ifdef 32位 1.內存對齊1.1 內存對齊概要現代計算機中內存空間都是按照byte劃分的,從理論上講對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定變量的時候經常在特定的內存地址訪問,這就需要各類型數

cc++裏struct字節規則

inf mage style csdn博客 tps get lan 字節對齊 img   規則一.: 每個成員變量在其結構體內的偏移量都是成員變量類型的大小的倍數。   規則二: 如果有嵌套結構體,那麽內嵌結構體的第一個成員變量在外結構體中的偏移量,是內嵌結構體中那個數

struct自然邊界上的記憶體

    記憶體對齊大多數情況對程式設計師是透明的,是由編譯器自動處理。在C裡面允許我們干預記憶體對齊。而由於記憶體對齊的原因,巧妙的設計結構體也是非常必要的。   關於記憶體對齊問題,字、雙字和四字在自然邊界上不需要在記憶體中對齊,對字、雙字和四字來

淺析內存與ANSI C中struct型數據的內存布局

開發 分析 clas type spa 速度 嚴格 通過 取數據 這些問題或許對不少朋友來說還有點模糊,那麽本文就試著探究它們背後的秘密。 首先,至少有一點可以肯定,那就是ANSI C保證結構體中各字段在內存中出現的位置是隨它們的聲明順序依次遞增的,並且第一個字段的首地址等

C語言中的struct——記憶體

sizeof計算結構體大小的時候具體是怎樣計算的 記憶體對齊的原則是根據最寬資料型別的大小進行對齊的 struct A { char a; 1+1 short b; 2 int c; 4 }; 大小是8個位元組 要進行記憶體對齊,是

32位與64位 CPU、編譯器、作業系統、應用程式armX86關係

一:arm和X86的區別 arm:對應精簡指令集 X86:對應複雜指令集 arm上的和X86上編譯過的的東西是不能相互使用的,因為指令集不一樣嘛。指令集可以通俗的理解為,溝通語言。arm和X86之間東西不能直接用,類似於一個美國人和一箇中國人各自只說自己的語言,那麼這兩個人是沒法溝通的。

微信小程式圖片文字水平垂直居中解決方案

我們知道常用的居中對齊方式有很多種例如: text-align:center; align-items:center; justify-content: center; margin: auto; #子容器在父容器中居中 但是在view中的文字對齊卻不能簡單的使用text-ali

C語言之struct大小、首地址與記憶體—由結構體成員地址得到結構體首地址

被問到如下問題:給定一個結構體中某個變數地址,可否得到結構體變數的地址? 答案是可以,但是對不同的場合有不同的結果;這與微處理器平臺、編譯器的處理不可分割。 首先,對於處理器,大尾端、小尾端的因素必須考慮; 其次: 一、 ANSIC標準中並沒有規定,相鄰宣告的變數在記憶體中一定要相鄰。 為了程式的高效性,

c/c++ struct的定義、宣告、方式

一、定義/宣告方式 第一種:僅有結構體名,不定義/宣告變數 struct MyStruct{     int i;     char a[10];     double b;};第二種:有結構體名,

opencv在armx86上的移植

一、開發環境 作業系統:fedora14 Opencv版本:2.0 Qt版本:4.7 arm:mini6410 交叉編譯工具:arm-linux-gcc-4.5.1 二、安裝與配置 Linux系統的安裝,交叉Qt-creator的安裝還有交叉編譯工具的安裝,網上說的基本都

c++struct sizeof大小方式

先讓我們看四個重要的基本概念:1.資料型別自身的對齊值:對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。2.結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。3.指定對齊值:#pragma pack (value)時的