總結面試時沒有回答上的內存對齊問題

前兩天面試某公司時,沒有回答上的一個問題,總結如下,以供參考。

問:下面這個結構類型的實例變量占用多少內存:
struct struct1
{
??? int i;
??? short j;
??? char c;
};
我反問:是啥語言啥機器啥編譯環境?
他回答說:VC6.0下。
我:內存對齊后占8byte。
他又繼續問:如何讓它只占7byte?
我的第一反應是使用位段,正準備回答,又感覺不對,位段不能讓它不對齊啊。又想了幾秒鐘,還是不會,只好回他說沒玩過……


今天下午去圖書館翻了下《代碼優化:有效使用內存》,發現里面提到了兩種方法:
法1:
#pragma pack(push)
#pragma pack(1)
struct struct1
{
??? int i;
??? short j;
??? char c;
};
#pragma pack(pop)


法2:
修改編譯指令的參數,來禁止內存對齊:
VC++?????? ? ? ? :/Zn1(VS2005下,右擊項目-屬性-配置屬性-C/C++-代碼生成-結構成員對齊-選“1字節(/Zn1):”(即禁止內存對齊),默認是使用默認值,即按照結構中占用空間最大的成員進行對齊。的size進行對齊。
Borland C++ : /-a1


法2是對整個項目禁用內存對齊,而法1可以針對特定的結構禁用內存對齊,其提供了更大的靈活性.



另外,該書中還提到:
char不對齊;
short沿偶地址對齊;
int/float沿取值為4的倍數的地址對齊。
double沿取值為8的倍數的地址對齊。


VS2005下,默認是使用默認值,即按照結構中占用空間最大的成員進行對齊,我們可以測試下面這個結構:
struct struct2
{
??? char i;
??? short d;
??? double c;
??? short j;
};

//保持為默認值或修改編譯參數/Zn?,猜下sizeof結果為多少?:)
printf("struct2:%d\n",sizeof(struct2));
struct2 st;
printf("%p\n",&st.i);
printf("%p\n",&st.d);
printf("%p\n",&st.c);
printf("%p\n",&st.j);

?

補充:數據的手工對齊:

char *p;
int temp = align_power-1;
p=(char*)malloc(need_size +?temp;
p=(char*)malloc(((int)p+temp)&temp);//修改了p,所以釋放p前記得要歸位
注:align_power是所需要的對齊冪,char*(也可以為int*)是指針類型。另外,釋放p之前記得讓其指向所申請的內存的首地址上。


本文轉自Silent Void博客園博客,原文鏈接:http://www.cnblogs.com/happyhippy/archive/2006/11/10/601224.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455050.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kibana入門安裝與介紹

Kibana入門 Kibana 是一款開源的數據分析和可視化平臺,它是 Elastic Stack 成員之一,設計用于和 Elasticsearch 協作。您可以使用 Kibana 對 Elasticsearch 索引中的數據進行搜索、查看、交互操作。您可以很方便的利用圖表、表格及地圖對數據進行多元化…

友善串口工具接收數據隨機換行_使用Python3+PyQT5+Pyserial 實現簡單的串口工具方法...

練手項目,先上圖先實現一個簡單的串口工具,為之后的上位機做準備代碼如下:pyserial_demo.pyimport sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtC…

Vue渲染函數

前面的話 Vue 推薦在絕大多數情況下使用 template 來創建HTML。然而在一些場景中,真的需要 JavaScript 的完全編程的能力,這就是 render 函數,它比 template 更接近編譯器。本文將詳細介紹Vue渲染函數 引入 下面是一個例子,如果要…

數據綁定原理

一、數據單向綁定原理指先把模板寫好,然后把模板和數據(數據可能來自后臺)整合到一起形成HTML代碼,最后把這段HTML代碼插入到文檔流里。缺點:一旦HTML代碼生成就沒有辦法改變,如果有新數據重新傳入,就必須重新把模板和…

視頻解碼優化

以下通過剖析一些經驗來了解視頻解碼優化 1. 在嵌入式系統中實現MPEG4的視頻解碼 有兩種方法可行 (1)采用ffmpeg(mplayer 的核心就是采用ffmpeg),然后對ffmpeg mp4解碼優化 1).對IDCT匯編化,并優化VLD的實現 ->inline&匯編化 2).根據ARM9 cache&cache…

Logstash入門簡介

Logstash入門簡介 介紹 Logstash是一個開源的服務器端數據處理管道,能夠同時從多個來源采集數據,轉換數據,然后將數據發送到最喜歡的存儲庫中(我們的存儲庫當然是ElasticSearch) 我們回到我們ElasticStack的架構圖&a…

Django templates 和 urls 拆分

如果在Django項目 下面新建了blog和polls兩個APP應用,在每個APP下面都各自新建自己的url和templates,那么我們需要如何進行項目配置呢? INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, dja…

springboot怎么殺進程_線上服務平均響應時間太長,怎么排查?

線上服務平均響應時間太長,怎么排查?https://xie.infoq.cn/article/914b5c56000a3880016abd8d6前言:最近線上環境某個接口服務響應時間偏長,導致用戶體驗超差,那平時該怎么快速的排查這類問題呢?①、為代碼…

Redis學習第五課:Redis Set類型及操作

Set是集合,它是string類型的無序集合。set是通過hash table實現的,添加、刪除和查找的復雜度都是O(1)。 對集合我們可以取并集、交集、差集。通過這些操作我們可以實現SNS中的好友推薦和blog的tag功能。 Set集合操作: sadd:向名稱為Key的set中…

MPEG音視頻編解碼之MP3編解碼概述

2 MP3編解碼原理 2.1 MP3音頻壓縮標準概述 MP3全稱是動態影像專家壓縮標準音頻層面3(Moving Picture Experts Group Audio Layer III)。是當今較流行的一種數字音頻編碼和有損壓縮格式,它設計用來大幅度地降低音頻數據量,而對于…

Python實現GitBook工具

寫在前面 本工具是通過Python腳本實現 GitBook 自動 生成 執行 編譯 發布的功能 你可以在這里下載exe 使用 1. exe下載,并移動位置 將exe文件放在你的gitbook文件夾中,或者放在空文件夾中 2. file.md 創建 名為file.md的文件,在你要寫book的目錄下 注意: 這里file.md文件名…

shell腳本中用到的條件和循環語句

本博文介紹一下shell腳本中常用的條件和循環語句:條件語句:循環語句:示例:if語句:eg1.eg2.2.case語句:簡單的case語句:配合循環的case語句:3.for語句:簡單的for語句&…

BZOJ 2243 染色(樹鏈剖分好題)

2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 7971 Solved: 2990[Submit][Status][Discuss] Description 給定一棵有n個節點的無根樹和m個操作,操作有2類: 1、將節點a到節點b路徑上所有點都染成顏色c; 2、詢問…

processing動態代碼大全_做一張動態海報需要多少步?

人們習慣性地把程序員跟設計師分成兩種不同性質的人,好像程序員就不會有美感,設計師邏輯思維就一定會很弱,但最近幾年我們發現越來越多的程序員學設計,設計師學編程的跨界故事。新媒體藝術家,邱偉豪也是其中一員&#…

【ffmpeg for wince】音視頻編解碼多平臺移植(for window/wince)

from: http://www.cnblogs.com/windwithlife/archive/2009/05/31/1492728.html 終于完成了了第二個Client side原型(for Wince),其中花掉我最多時間的就是ffmpeg的對WINCE的移植。其中有大半時間是由于網上的一些不完整及不正確信息所誤導,…

python實現猴子爬山算法

猴子爬山一只頑猴在一座有N級臺階的小山上爬山跳躍。上山時需從山腳至山頂往上跳N級臺階&#xff0c;一步可跳1級&#xff0c;或跳3級&#xff0c;求上山有多少種不同的跳法&#xff1f; &#xff08;N<50&#xff09; 問題分析: 每一次都可以選擇1,2,3有3種跳法 方法1 直…

指針版 單鏈表復習

#include <bits/stdc.h> #define P pair<int,int> using namespace std;typedef long long LL;typedef struct LNode{int data;struct LNode *nxt; }LNode,*LinkList;bool Linklist_init(LinkList &root){root new LNode; ///分配頭結點&#xff0c;指針域為空…

手寫springboot_Spring Boot 入門教程 | 圖文講解

目錄一、Spring Boot 是什么二、為什么要使用 Spring Boot三、快速入門3.1 創建 Spring Boot 項目3.2 項目結構3.3 引入 Web 依賴3.4 編寫第一個接口3.5 啟動程序&#xff0c;驗證效果四、總結五、GitHub 示例代碼一、Spring Boot 是什么以下截圖自 Spring Boot 官方文檔&#…

lunix 安裝python3

Linux下默認系統自帶python2.6的版本&#xff0c;這個版本被系統很多程序所依賴&#xff0c;所以不建議刪除&#xff0c;如果使用最新的Python3那么我們知道編譯安裝源碼包和系統默認包之間是沒有任何影響的&#xff0c;所以可以安裝python3和python2共存 首先去python官網下載…

手機音視頻應用開發(專注于Symbian、iPhone、Android等跨平臺音視頻應用開發方案)

一款好的手機應用&#xff0c; 能讓用戶在第一分鐘就愛上他&#xff0c; 一款爛的手機應用&#xff0c; 能讓用戶在第一分鐘就要卸載它。 好的應用必須的穩定、快速。市場日益激勵&#xff0c;一個項目的周期是一個漫長的過程&#xff0c;投入的時間、精力、費用。一筆龐大的預…