结构体占用内存大小计算

问题描述

结构体占用内存大小计算


第一个我理解为 和 double对齐是16
第二个 是 4*3 = 12
第三个理解为 (1+7)+8= 16
第四个 8* 3 =24;

和运行的出来的结果完全不对啊,,看了好几篇 对齐的文章,,把文章示例抄过来运行都是错的。。。。。感觉我这块理解有 严重误区啊

解决方案

看上去编译器像是4字节对齐,double占两个单位
4+8
4+4+4
4+8
4+8+4

解决方案二:

结构体占内存大小计算
struct结构体占内存大小计算
struct结构体占内存大小计算

解决方案三:

你的想法在gcc 4.9.2 x86_64 上是对的。

解决方案四:

我觉得你应该先用sizeof()确定下各种类型的字节长度,然后再用字节对齐方式分析。如果还不能分析清,我们再讨论

解决方案五:

你先定义一个结构体指针,并给它附上初值,记录下此时指针指向的地址数值,再让该指针加一,然后记录下此时指针存储的地址,两者相减就可以得到结构体占用的内存大小了

解决方案六:

和地址最大到对其,不过也要看是否是4到倍数

解决方案七:

另外,你拿别人的示例运行结果不同很正常。 第一,操作系统不同,编译环境不同,都可能导致各类型占内存字节大小不同。 第二,编译环境不同,有可能结构体内存对齐系数不同。你的环境有可能是4字节对齐。 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

解决方案八:

看着就像是大神级别的人物,语言C和系统Linux是不是。觉得会C和Linux的都是大神,可是我一点都不会,该怎么办?

解决方案九:

内存对其问题,结构体中的数据对其一般以最大的数据类型所占内存对其,其次就是内存必须是2或4的整数倍。

解决方案十:

示例程序是按照4字节对齐,变量a,aa,b,hh的在栈上的布局应该如下(其中,一个字符表示一个字节):

另外,楼主可以使用宏**#pragma pack(n) **指定编译时的对齐参数,多尝试几次,比较下就出来结论了。

时间: 2024-09-18 02:30:55

结构体占用内存大小计算的相关文章

c-下面这个结构体的内存占用是什么样的,重点是union那里

问题描述 下面这个结构体的内存占用是什么样的,重点是union那里 struct st { char ch,*ptr; union { short a , b; unsigned int c : 2 , d : 1; }; bool f; struct st *next; }; 解决方案 union是共享内存, 一个short是两字节,两个是四字节 int是四字节,刚好两者可以用union 解决方案二: 要根据所用的编译器来,这里以32位编译器作为说明: ch:1 byte; ptr: 4 by

一道用 sizeof 求结构体所占大小的笔试题?求教

问题描述 一道用 sizeof 求结构体所占大小的笔试题?求教 下列程序,为什么输出的结果是 120? int main(int argc, char* argv[]) { union u_type { int i; double x; float f; }; struct str_type { char str[100]; union u_type u[2]; }; printf("%dn",sizeof(struct str_type)); } 解决方案 首先union u_typ

《从缺陷中学习C/C++》——6.16 结构体成员内存对齐问题

6.16 结构体成员内存对齐问题 从缺陷中学习C/C++ 代码示例 struct{ char flag; int i; } foo; int main() { foo.flag = 'T'; int pi = (int )(&foo.flag + 1); *pi = 0x01020304; printf("flag=%c, i=%x\n", foo.flag, foo.i); return 0; } 现象&后果 代码中定义了一个结构体,包括一个字符成员flag和整型成员

详解C语言中的内存四区模型及结构体对内存的使用_C 语言

内存四区 1.代码区代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段,这块内存是不可以在运行期间修改的.2.静态区所有的全局变量以及程序中的静态变量都存储到静态区.3.栈区栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出.对于自动变量,什么时候入栈,什么时候出栈,是不需要程序控制的,由C语言编译器.实现栈不会很大,一般都是以K为单位的. 当栈空间以满,但还往栈内存压变量

Android中一张图片加载后所占用内存大小的获取与测试

Android程序中一旦加载的图片比较多,就有可能出现Out of Memory而导致程序崩溃.这个一方面是因为Android系统本身对于每个单独的进程有内存大小的限制(有16M,64M,128M,256M等等),另一方面是因为Android系统对于图片资源的垃圾回收比较慢(文章http://jiangnane.com/index.php/archives/230中对Android源码进行了分析,发现Android的setImageViewBitmap(Bitmap bm)方法的源码中没有建立新

查看redis占用内存大小的情况

redis缓存固然高效,可是它会占用我们系统中宝贵的内存资源,特别是当我们的项目运行了一段时间后,我们需要看一下redis占用了多少内存,那么可以用"info"命令查看. 执行info命令后,找到Memory这一栏,就可以看到内存的使用信息了,如下图:   # Memory   used_memory:13490096 //数据占用了多少内存(字节)   used_memory_human:12.87M //数据占用了多少内存(带单位的,可读性好)   used_memory_rss:

C/C++语言中结构体的内存分配小例子_C 语言

当未用 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度对齐:当使用了 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度和 #pragma 指令指定的位数中的较小值对齐. #pragma 指令格式如下所示:#pragma pack(4)     // 或者 #pragma pack(push, 4) 举例如下:(机器字长为 32 位)    struct    {        char a;    }test;    printf("%d

sizeof(结构体)地址对齐问题

问题描述 sizeof(结构体)地址对齐问题 写出sizeof(struct name2)的结果struct name2{ char str; int num; short x; }写出sizeof(struct name1) 的结果 struct name1{ char str; short x; int num; }地址对齐不太会,求指教! 解决方案 取决于对齐大小,比如缺省4字节对齐struct name2{char str; // 因为num要4字节,str本身1字节,但是为了对齐,所以

Java Cache-EHCache系列之计算实例占用的内存大小(SizeOf引擎)

在EHCache中,可以设置maxBytesLocalHeap.maxBytesLocalOffHeap.maxBytesLocalDisk值,以控制Cache占用的内存.磁盘的大小(注:这里Off Heap是指Element中的值已被序列化,但是还没写入磁盘的状态,貌似只有企业版的EHCache支持这种配置:而这里maxBytesLocalDisk是指在最大在磁盘中的数据大小,而不是磁盘文件大小,因为磁盘文中有一些数据是空闲区),因而EHCache需要有一种机制计算一个类在内存.磁盘中占用的字