C/C++基础笔试题1.0(字节对齐)

传说中博文标题带有笔试、面试等点击率都会很高呢?我也试试!

众生皆是码农命,我们这种即将战秋招的渣渣,既没有超凡的能力,也没有流弊的项目,怎么破?

唯独苦苦怒刷基础,笔试题,面试题,因为以前常常刷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;
}

结果是什么呢?这个根据我们的“分床”规则,很容易理解的。

下面我们来另外一个例子。

#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(字节对齐),布布扣,bubuko.com

时间: 2024-10-20 02:22:44

C/C++基础笔试题1.0(字节对齐)的相关文章

C/C++基础笔试题1.1.1(运算符十问)

本文似乎都是问题,意在引起思考,回忆,主题是运算符,另外这些问题是没有特别的逻辑上的关系,只是我想到的就问了,虽然是随便问,但是你能不能随便答呢?. 运算符,我们在每一个程序中都会用到,也是最最基础的基本功,本系列C/C++基础笔试题等,是没有纲要,没有规律的一系列博文. 为什么这样子,因为作者是渣阿,他只能学一点说一点,力求通俗阿,傻瓜但不失主线阿. 1.0写的是字节对齐,没看过有兴趣的朋友可以戳这里.1.1写的是与运算符相关的内容,你最"熟悉"的"朋友". 首先

C/C++基础笔试题1.1.2(运算符十问之解)

上一节写了一篇不负责任的博文,被踩了呢,导致有点失落呢. 其实纯问问题,的确是不好,因为看博文很大一个优势就是为了更直接看到想看的东西. 好啦,回归整题. 1.你脑海中的运算符有哪些,按优先级排个序?  这个问题明显没有标准答案,但是最基本的还是要有吧. 比如+ ,- ,* ,/ ,%, 前++/--,后++/--,=,<, >, << ,>>,(),&,^,|,~以及逗号","域名符"::",&&,||等

Android开发面试经——2.常见Android基础笔试题

关注finddreams博客: http://blog.csdn.net/finddreams/article/details/44219231 正值跳槽的热季,整理一下Android面试中最常考的笔试题,为下次找工作时做好充分准备,这是Android的基础部分: 1.Android四大组件是什么?作用以及应用场景? Android 的四大组件分别是是Activity,Service,BroadcastReceiver和ContentProvider: Activity: 从字面上理解,Acti

Android开发面试经——4.常见Java基础笔试题

关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44403041 因为Androd使用Java语言来编程的,所以我们做Android开发全面的掌握Java基础是必须的.在面试的过程中,我们发现很多公司发的笔试题有很多知识点都是Java的,搞安卓久了,Java基础的一些知识点也都快忘了,今天就让我们来一起复习一些Java基础,希望能在面试中用到: 1.Overload和Override的区别.Overloaded的方法是

零基础入门之结构体字节对齐

一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址:另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是windows下是这样的,但在linux的gcc编译器下最高为4字节对齐),否则在前一类型后补0:这里特别提到的是数组一定要注意,而且在一些编程的技巧中,我们可以使用数组强制字节达到对齐的目的.这在网络编程中是很常见的. 举例:比如CHAR型占用空间为1字节,则其起始位置必须可被1整除.INT为4字节,其起

iOS开发基础笔试题(3)

前言 以下部分题目来源于网络,笔者在此处收集起来,既是要巩固自我,也希望能够帮助到同样需要的人!参考答案均为笔者所写,其有疑问或者出错之处,请在评论中提出,谢谢!不喜勿喷! 1.即时聊天App不会采用的网络传输方式 1 2 3 4 5 6 A UDP B TCP C HTTP D FTP 参考答案:D FTP:是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的: UDP:是面向无连接的传输层协议,数据传输是

ios基础笔试题-集锦二

前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1.即时聊天App不会采用的网络传输方式 A. UDP B. TCP C. HTTP D. FTP FTP:是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的: UDP:是面向无连接的传输层协议,数据传输是不可靠的,它只管发,不管收不收得到: TCP:是面向连接的,可靠的传输层协议: HTTP:是超文本

基础笔试题

1.在MySQL中,下列关于触发机器的描述正确的是(    ) 正确答案 :AC A    MySQL的触发器只支持行级出发,不支持语句级触发 B    触发器可以调用将数据返回客户端的存储程序 C    在MySQL中,使用new和old引用触发器中发生的记录内容 D    在触发器中可以使用显示或者隐式方式开始或结束事务的语句 2.假如在MySQL中有存储过程proc1(员工编号,月份)用来查询员工的工资,两个参数类型均为字符类型,则下列调用存储过程的方法正确的是(    ) 正确答案 :

Java基础笔试题

一. 选择题(共50题,每题2分,共100分.多选题选不全或选错都不得分.) 1. 以下属于面向对象的特征的是(C,D).(两项) A) 重载 B) 重写 C) 封装 D) 继承 解析:面向对象的三大特性:封装.继承.多态. 2. 以下代码运行输出是(C) public class Person{ private String name="Person"; int age=0; } public class Child extends Person{ public String gra