1. 程式人生 > >VC++平臺上的記憶體對齊操作

VC++平臺上的記憶體對齊操作

我們知道當記憶體的邊界正好對齊在相應機器字長邊界上時,CPU的執行效率最高,為了保證效率,在VC++平臺上記憶體對齊都是預設開啟的,在32位機器上記憶體對齊的邊界為4位元組;比如看如下的程式碼:

struct MyStruct
{
    int i;
    char c;
};
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(MyStruct)<<endl;
    return 0;
}

此時輸出的結果並不是sizeof(int) + sizeof(char) = 5而是8,因為記憶體對齊的原因,將char分配為4個位元組效率更高;

在VC平臺上我們可以通過預處理指令:#pragma pack(show)來檢視當前記憶體對齊的方式,我們在程式碼前加上一句#pragma pack(show),再次編譯,在編譯器的“生成”視窗中看到一個警告:“warning C4810: 雜注 pack(show) 的值 == 8”說明這時編譯器採用的是8位元組的對齊方式,另外可以通過這個預處理指令更改對齊方式,比如將程式碼改寫一下:

#pragma pack(show)
#pragma pack(1)

struct MyStruct
{
    int i;
    char c;
};
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof
(MyStruct)<<endl; system("PAUSE"); return 0; }

這個時候得到結果為5,也就是說我們已經將對齊方式改為了1;
除了這個預處理指令我們也可以通過VC++擴充套件關鍵字align來改變記憶體的對齊方式:

#pragma pack(show)
#pragma pack(1)

struct MyStruct
{
    int i;
    char c;
};

struct __declspec(align(1)) MyStruct1
{
    int i;
    char c;
};

int _tmain(int
argc, _TCHAR* argv[]) { cout<<sizeof(MyStruct)<<endl; cout<<sizeof(MyStruct1)<<endl; system("PAUSE"); return 0; }

這個時候輸出的結果為兩個5;

相關推薦

VC++平臺記憶體操作

我們知道當記憶體的邊界正好對齊在相應機器字長邊界上時,CPU的執行效率最高,為了保證效率,在VC++平臺上記憶體對齊都是預設開啟的,在32位機器上記憶體對齊的邊界為4位元組;比如看如下的程式碼: struct MyStruct { int i;

struct自然邊界記憶體

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

Android平臺,C/C++程式碼記憶體問題(signal SIGBUS Error)

最近手機版本老出現崩潰,之前出現過,但很偶然。最近出現機率比較高,就跟查一下。 報了signal SIGBUS BUS Error,最終定位在uint32_t i32 = *((uint32_t*)m_data); 這句語出了問題, 確認m_data記憶體是正確的,並且在P

VC記憶體準則

本文所有內容在建立在一個前提下:使用VC編譯器。著重點在於:VC的記憶體對齊準則;同樣的資料, 不同的排列有不同的大小,另外在有虛擬函式或虛擬繼承情況下又有如何影響? 記憶體對齊?!What?Why? 對於一臺32位的機器來說如何才能發揮它的最佳存取效率呢?當然是每次

淺談記憶體--linux和windows平臺記憶體分配的差異

一.記憶體對齊的初步講解 記憶體對齊可以用一句話來概括: “資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上” 例如int型別佔用4個位元組,地址只能在0,4,8等位置上。 例1: #include <stdio.h> struct xx{  

記憶體的初步講解--linux和windows平臺記憶體分配的差異

一.記憶體對齊的初步講解 記憶體對齊可以用一句話來概括: “資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上” 例如int型別佔用4個位元組,地址只能在0,4,8等位置上。 例1: #include <stdio.h> struct xx{  

vc記憶體

#include<stdio.h> typedefstruct MyStruct    {    double dda1;    char dda;    int type;   }MyStruct;    typedefstruct MyStruct2 

C++虛擬函式表以及記憶體文章

C++虛擬函式表以及記憶體對齊文章 C++ 物件的記憶體佈局(上) https://blog.csdn.net/haoel/article/details/3081328 C++ 物件的記憶體佈局(下) https://blog.csdn.net/haoel/article/deta

結構體記憶體模式

結構體的位元組大小,一個簡單的結構體定義如下,這個結構的大小應是8位元組(32位下) typedef struct MODEL4 { char c; int x; }MODEL4; char的大小是1,而int是4,但總的大小是8,這就是結構體記憶體對齊的原因。在32位的機器上,資料是以

C++11 記憶體 alignof alignas

一 現象 先看一段程式碼: struct s1 { char s; int i; }; struct s2 { int i; double d; }; cout << "-------basic type" << endl; c

行內函數,巨集定義,記憶體,型別轉換

巨集 與 inline的區別 存在的價值,兩者都是文字替換,降低程式跳轉次數,提高效率 1. define 是預處理命令,無法除錯 ,最簡單文字替換,     inline 是編譯期替換,可以除錯, 存在引數型別檢查 2. 使用inline的時候,函式必須定義   直接定義的函式

記憶體演算法

--------------------------------------------- -- 時間:2018-11-09 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] ----------------------------------------

關於記憶體

記憶體對齊可以用一句話來概括:“資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上” 例如int型別佔用4個位元組,地址只能在0,4,8等位置上。 位元組對齊的緣故,如下的結構體的佔用記憶體是一樣 struct A{       &

現代計算機記憶體機制

64位計算機和32位計算機CPU對記憶體處理的區別 64位CPU,位寬為8個位元組。(64位/8位/位元組=8位元組) 32位CPU,位寬位4個位元組。(32位/8位/位元組=4位元組) 我們假想記憶體空間是一個二階矩陣。(事實上記憶體是一維線性排列的) 那麼二維陣列的列數在64位C

結構體記憶體總結

  首先我們都知道結構體是多個變數的集合,在其中可以存放整型,浮點型等等各種,然後結構體記憶體是如何對齊的呢,他並不是按連續順序去排下去的,首先我們先上一段程式碼 #include<iostream> #include<cstdlib> using namesp

結構體的大小 記憶體

結構體的大小 記憶體對齊   Struct A {    int a;    int b; };  int main() { Printf(“%d\n”,sizeof(struct A)); 共佔8位

記憶體和補

  對齊:是針對單個成員變數的; 補齊:是針對擺放的所有成員變數的整體而言要對齊; //4位元組的對齊粒度 #pragma  pack(4)       // #pragma pack(n) /* n = 1,

初夏小談:結構體記憶體詳解

記憶體對齊?什麼是記憶體對齊? 對於這個問題我們先來看看這樣的一個結構體(在32位系統下) typedef struct Stu1 { char C1; int num1; short S1; }Stu1; 如果我們不知道記憶體對齊或者不清楚記憶體對齊時,我們可能這樣分析

關於記憶體的問題

在最近的專案中,我們涉及到了“記憶體對齊”技術。對於大部分程式設計師來說,“記憶體對齊”對他們來說都應該是“透明的”。“記憶體對齊”應該是編譯器的 “管轄範圍”。編譯器為程式中的每個“資料單元”安排在適當的位置上。但是C語言的一個特點就是太靈活,太強大,它允許你干預“記憶體對齊”。如果你想了解 更加

為何要記憶體

 為何要記憶體對齊 http://www.ibm.com/developerworks/library/pa-dalign/ 因為處理器讀寫資料,並不是以位元組為單位,而是以塊(2,4,8,16位元組)為單位進行的。如果不進行對齊,那麼本來只需要一次進行的訪問,可能需要好幾次才能完成,並且還要進