C/C++基礎筆試題1.0(位元組對齊)

來源:互聯網
上載者:User

標籤:targe   get   asp   基礎   href   log   tac   c/c++   編譯環境   

傳說中博文標題帶有筆試、面試等點擊率都會非常高呢?我也試試!

眾生皆是碼農命,我們這樣的即將戰秋招的渣渣。既沒有超凡的能力。也沒有流弊的項目,怎麼破?

只有苦苦怒刷基礎,筆試題,面試題。由於曾經經常刷OJ,所以非常多面試題的編程題倒是能夠解。可是筆試題或者基礎題我就不記得了,只有慢慢回憶。

況且,寫這樣的面試題,誰能寫得贏JULY神。

今天首先講得是位元組對齊。

注意:我是一個渣,所以我僅僅能按自己的理解來說了(要不然怎麼會這麼慘呢?)。假設你想看大神的解釋。請看這裡 

來看個題目

#include <iostream>using namespace std;struct A{   char b;    int a;  };int main(){    A a;    cout<<sizeof(a);    return 0;}

請問上述輸出的是什麼呢?A.5,B.6.C7.D.8

答案是:D,假設你選A,那麼恭喜你。你不知道什麼叫位元組對齊。

(我也不知道。╮(╯▽╰)╭)

按我的理解來說。在結構體中,分配的空間,是有“格式”的。好比宿舍。我們住人的時候,床總是一樣的。有些人可能會短,有些人可能會比較長,可是他們誰的床要一樣的,為什嗎?一就是統一,二就是高效(統一是為了不同硬體上做出的效果一致。高效是源於讀取規律性強)。

我們的床的長度決定於“最長的人的長度”(奇怪,為什麼我總是要用長短來形容人,不科學。)

之後我們就能夠分配床了,可是有時候會出現幾個人睡一張床,看範例吧。

範例1

#include <iostream>using namespace std;struct A{   char b;   int a;};struct B{   char b;   char c;   int a;};struct C{   char b,c,d;   int a;};int main(){    A a;    B b;    C c;    cout<<sizeof(a)<<" "<<sizeof(b)<<" "<<sizeof(c)<<endl;;    return 0;}

輸出的結果是8,8,8。

為什嗎?

最長的是4,那麼就是4個位元組為一張床啦,你能一起睡就一起睡,不能就自己再開一張唄。

最後來看一看這個題目,你認為輸出是什嗎?

之後你自己再用你的機器跑一下試試。

#include <iostream>using namespace std;struct A{//四個位元組對齊   char b;   int a;};struct B{//四個位元組對齊,b,c"共床"   char b;   char c;   int a;};struct C{//d開“新床”   char b,c;   int a;   char d;};struct D{//8位元組對齊,short佔兩個位元組的!   short a;   int b;   long long c;};struct E{//a開新床   int b;   long long c;   short a;};struct F{//什麼都沒有,也要佔一個};struct G{//那麼double呢?8個位元組      int b;   double c;   short a;}; int main(){    A a;    B b;    C c;    D d;    E e;    F f;    G g;    cout<<sizeof(a)<<" "<<sizeof(b)<<" "<<sizeof(c)<<" "<<sizeof(d)<<" "<<sizeof(e)<<" "<<sizeof(f)<<" "<<sizeof(g)<<endl;;    cout<<sizeof(A)<<" "<<sizeof(B)<<" "<<sizeof(C)<<" "<<sizeof(D)<<" "<<sizeof(E)<<" "<<sizeof(F)<<" "<<sizeof(G)<<endl;;    return 0;}

結果是什麼呢?這個依據我們的“分床”規則。非常easy理解的。

以下我們來另外一個範例。

#include <iostream>using namespace std;#pragma pack(4)   // 4位元組對齊  struct A{//四個位元組對齊   char b;   int a;};struct B{//四個位元組對齊,b,c"共床"   char b;   char c;   int a;};struct C{//d開“新床”   char b,c;   int a;   char d;};struct D{//8位元組對齊,short佔兩個位元組的!

short a; int b; long long c;};struct E{//a開新床 int b; long long c; short a;};struct F{//什麼都沒有。也要佔一個};struct G{//那麼double呢?8個位元組 int b; double c; short a;};#pragma pack() int main(){ A a; B b; C c; D d; E e; F f; G g; cout<<sizeof(a)<<" "<<sizeof(b)<<" "<<sizeof(c)<<" "<<sizeof(d)<<" "<<sizeof(e)<<" "<<sizeof(f)<<" "<<sizeof(g)<<endl;; cout<<sizeof(A)<<" "<<sizeof(B)<<" "<<sizeof(C)<<" "<<sizeof(D)<<" "<<sizeof(E)<<" "<<sizeof(F)<<" "<<sizeof(G)<<endl;; return 0;}

上面用到了#program pack(4),其意思為系統所給定的位元組對齊為4,我們在實際採取的位元組對齊是什麼呢?取得是min(給定的,和結構體裡面最大的)。

再下來,看這個範例就明確了

#include <iostream>using namespace std;#pragma pack(8)   // 8位元組對齊  struct A{//四個位元組對齊   char b;   int a;};struct B{//四個位元組對齊,b,c"共床"   char b;   char c;   int a;};struct C{//d開“新床”   char b,c;   int a;   char d;};struct D{//8位元組對齊,short佔兩個位元組的!   short a;   int b;   long long c;};struct E{//a開新床   int b;   long long c;   short a;};struct F{//什麼都沒有,也要佔一個};struct G{//那麼double呢?8個位元組      int b;   double c;   short a;};#pragma pack() int main(){    A a;    B b;    C c;    D d;    E e;    F f;    G g;    cout<<sizeof(a)<<" "<<sizeof(b)<<" "<<sizeof(c)<<" "<<sizeof(d)<<" "<<sizeof(e)<<" "<<sizeof(f)<<" "<<sizeof(g)<<endl;;    cout<<sizeof(A)<<" "<<sizeof(B)<<" "<<sizeof(C)<<" "<<sizeof(D)<<" "<<sizeof(E)<<" "<<sizeof(F)<<" "<<sizeof(G)<<endl;;    return 0;}

來到這裡,我想說的是。自己手動湊一湊對齊,能夠節省一點空間,儘管在實際中這點空間並不會影響非常大。

即

struct{

  char a;

  int b;

  char c;

};

盡量改為

struct{

  char a,c;

  int b;

}

假設你有什麼疑問,或者有什麼不正確的,記得評論指出我。不然難得會看我部落格的人都被害了~

最後,想跟大家說,有些知識。不是別人說出來就是對的。要自己試,自己試認為有理就是有理。


THEN

應博友的要求。我們談一下棧對齊,大家能夠看這裡,按我膚淺的看法。

事實上所謂棧對齊,就是在分配棧空間時候會依照2位元組或者4位元組對齊。這個要看詳細編譯環境。

在微軟和GCC下效果數不一樣,實際上我也不是特別懂。所以我也不好說怎麼樣。






C/C++基礎筆試題1.0(位元組對齊)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.