参考 : http://www.jianshu.com/p/b1fcb6c73b28 http://blog.csdn.net/mbh_1991/article/details/10241785
其实 , 我想找的工作是与Java相关的,可是每次做的几乎都是c/c++的题目 == ;
第一道题 :
输出什么 ?
#include<stdio.h> struct A { unsigned char x; unsigned char y; int z; }; int main(){ struct A a; printf("%d,%d,%d,%d",sizeof(a)); return 0; }
输出的是 : 拷贝代码 试试, or.....
这道题目中,怎么求sizeof(a) , 即a所占的字节大小!
一般的我们,可能就会字节根据每个基本数据类型的字节大小,相加就得到了,比如这里,1+1+4 , 可是真的这么简单吗?
99%的不可能,这里牵扯到的就是结构体的对齐问题;
那么什么是结构体的对齐?
看下面这个图 : 这三个元素都是位于同一个结构体中,倘若没有对齐的话,如果我们想访问第二个short元素,由于中间夹杂了别的元素
访问效率降低,而当进行了对齐处理后,每个元素都按照相应的参数对齐,比如这里是2,按照2对齐,访问第二个short的时候,直接访问第5个地址就可以了。
对齐的准则:
a.第一个成员起始于0偏移处 b.每个成员按其类型大小和指定对齐参数n中较小的一个进行对齐 // n = min(max(结构体中数据类型) , #pragma pack(n)) c.结构体总长度必须为所有对齐参数的整数倍 d.对于数组,可以拆开看做n个数组元素
回到上面的题目 , 结构体所占字节最大的数据类型为int (4) , prama pack(n) 后面那道题会有, 默认会是8; 所以 对齐参数 = min(4,8) = 4
所以,我们可以得到该结构体在内存中的分布 ; x , (0 , 1) y (1 ,2) z (4,8) 如果不对齐处理的话,那么z的地址空间就会(2,6);
所以,该结构题所占的内存空间为8字节!
第二道题 :
#include<stdio.h> #include<stdint.h> #pragma pack(8) //struct X{ //第一种 // uint8_t a; // unsigned char 1 // uint32_t b; // unsigned int 4 // uint16_t c; // unsigned short int 2 //}; struct X{ // 第二种 uint8_t a; uint16_t c; uint32_t b; }; #pragma pack() int main(){ struct X x; printf("%p\n" , x.a); printf("%p\n" , x.b); printf("%p\n" , x.c); printf("%d\n",sizeof(x)); return 0; }
如果按照第一种的方式构建结构体,
n = min(4, 8) = 4
内存分布 : a (0,1) , b(4,8) , c (8 ,10 ) (1, 4) and (10 , 12) 填充 , 所以 size = 12字节
如果按第二种方式 ;
因为a c 可以放在一个(0 , 4) 里面, 所以,size = 8字节
看图 :
拓展一下 :
#include <stdio.h> #pragma pack(8) //#pragma pack(4) struct S1 { short a; int b; }; struct S2 { char c; struct S1 d; // 在这个结构体中引用了另一个结构体 , 如果对齐 double e; }; #pragma pack() int main() { struct S2 s2; printf("%d\n", sizeof(struct S1)); printf("%d\n", sizeof(struct S2)); return 0; }
在这个结构体中引用了另一个结构体 , 如果对齐参数为4, 那么在结构体s2中, char 类型 可以 与 结构体s1中的short合并?
运行一下就知道了;
答案是不会的,当 #pragma pack(4)是,即对齐参数=4 , s1的size= 4 , s2的size = 4 + 8 + 4 + 4 = 20 double = 8字节
看图 : 看到了 1 那个地方是不会合并的
如果对齐参数是8字节,同理可得到 , size= 24 ;
相关推荐
本文给大家介绍的是关于C++结构体内存对齐计算的相关内容,内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。...
5. **内存管理**:堆栈与堆的区别,内存对齐,局部变量与全局变量的理解。 6. **预处理器与宏**:宏定义,条件编译。 7. **文件操作**:文件打开、读写、关闭等操作,文件指针。 8. **错误处理**:了解errno和...
- 静态与动态内存分配:了解malloc()、calloc()、realloc()和free()函数的使用,理解内存泄漏问题。 - 内存对齐和栈帧结构:理解编译器如何对内存进行对齐,以及栈上变量的生命周期。 4. **数组与字符串** - 一...
3. **结构体与联合体**:学习如何定义和使用结构体,理解结构体内存对齐,以及结构体指针的应用。了解联合体的使用场景及其内存特性。 4. **动态内存管理**:掌握malloc、calloc、realloc、free等函数的用法,理解...
- 结构体:定义结构体,结构体内存对齐,结构体数组,指针到结构体。 - 联合:了解联合的内存分配方式和使用场景。 4. **预处理器**: - 宏定义:使用#define创建宏,以及条件编译指令#include、#ifdef、#ifndef...
《C/C++笔试题集锦》是一份涵盖了广泛C/C++知识的资源,旨在帮助求职者准备相关的技术面试和笔试。这份资料不仅包含了常见的C/C++编程题目,还深入探讨了语言的一些关键概念,如类型转换和对象模型,这对于理解和...
2. C++内存布局与结构体大小计算:题目给出了四个结构体A、B、C、D,其中涉及到`#pragma pack(1)`来设置对齐方式,然后询问在32位机器上的大小。`#pragma pack(1)`用于设置结构体成员的对齐方式为1字节,这意味着...
- **堆**: 动态分配内存,由程序员手动管理。 - **代码段**: 存储程序的指令代码。 - **数据段**: 存储全局变量和静态变量。 ### 2. sizeof 结构体 ```cpp struct { short a; long b; char c; } d; ``` - `...
字节对齐对程序的影响主要体现在结构体或类的内存布局上。以32位x86环境下的GCC编译器为例,当定义如下结构体: ```cpp struct A { int a; char b; short c; }; struct B { char b; int a; short c; }; ``` ...
第七题提到了“尾端和头端”的概念,这通常指的是内存布局,与CPU架构有关,不是C语言特有,故A错误。C语言的内存分配和对齐策略确实受到编译器和平台的影响,B描述正确。 这些题目覆盖了C语言的基础知识,包括变量...
7. **结构体与联合体**:学习如何定义和使用结构体,理解结构体内存对齐,以及结构体指针的应用。 8. **内存管理**:了解动态内存分配(malloc, calloc, realloc, free)和栈与堆的区别。 9. **预处理器**:理解宏...
2. **指针与内存管理**:理解指针的概念,指针运算,动态内存分配(malloc/free或new/delete)以及内存泄漏问题。 3. **函数**:函数参数传递(按值、按引用、按地址),递归,函数指针,函数重载。 4. **结构体与...
- **结构体和联合体**:定义,初始化,结构体内存对齐,指针到结构体的使用。 - **位操作**:位移,按位与,按位或,按位异或,位域操作。 - **类型转换**:强制类型转换,隐式类型转换,类型兼容性。 - **文件...
5. **结构体与联合体**:自定义数据类型,理解内存对齐和数据成员的存储方式。 6. **内存管理**:动态内存分配(malloc、calloc、realloc、free),栈与堆的区别,内存泄漏问题。 7. **预处理器**:宏定义、条件...
本资源摘要信息涵盖了软件工程师经典笔试题 IT 笔试题的相关知识点,包括预处理指令、宏定义、 sizeof 运算符、类和结构体的空间大小计算等。 1.预处理指令#define 预处理指令#define 用于声明一个常数。例如,...
根据给定的富士施乐公司的C++笔试题目,我们可以将其拆解为多个知识点进行详细的解析与阐述: ### 1. 前缀运算符与后缀运算符 前缀运算符与后缀...以上就是富士施乐公司C++笔试题中涉及的主要知识点及详细解释。
这些题目涵盖了计算机科学和软件工程中的多个核心概念,主要涉及数据结构、算法、操作系统、网络协议、编程语言特性和软件开发技术。以下是每个题目及其相关的知识点详解...准备这样的笔试题可以提高在IT行业的竞争力。