有关内存对齐的疑问

zhhonghui 2007-07-11 02:19:47
#include<stdlib.h>
#include<stdio.h>

typedef struct str1
{
char a;
char b;
double c;
}STR1;
int main()
{
//float a;
printf("The size is: %d\n",sizeof(STR1));
return 0;
}

在网上看到“任何2字节大小的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。”
那么char的对齐模式应该是2或1,double为4
假设char为1,内存布局应该是
--------------
|a |b |////////| c | sizeof(STR1) == (1+1+2+4 = 8)
--------------
1bit 1bit 2bit 4bit
即使char为2,内存布局也应该是这样:
--------------
|a |//|b|//| c | sizeof(STR1) == (1+1+1+1+4 = 8)
--------------
1bit 1bit 4bit

但是结果却是12
...全文
192 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
其实我一开始就错了,double的模数的确是4
而size应为
2+2+8=12
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
a,b,c 的偏移量分别是
0,1,4

问题解决,结帖
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
呵呵,谢谢了,刚才我用man offsetof就有好多信息了
谢谢!
taodm 2007-07-11
  • 打赏
  • 举报
回复
我有msn不如你有msdn。
对齐啊,offsetof啊,标准C编程方面最佳文档就是msdn了。
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
不知道怎么使用那些东西,你有没有msn?我觉得那样请教更方便点
taodm 2007-07-11
  • 打赏
  • 举报
回复
使用标准C宏offsetof,可以让你看出每个字段现在的偏移量。
自己试试就知道了。
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
这是我gcc的版本信息:

gcc -v
使用内建 specs。
目标:i486-linux-gnu
配置为:../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release i486-linux-gnu
线程模型:posix
gcc 版本 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
taodm 2007-07-11
  • 打赏
  • 举报
回复
对齐的决定权是编译器,不是操作系统!
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
我查了几个资料,说是linux下超过2个字节的都是以4为对齐模数呀
taodm 2007-07-11
  • 打赏
  • 举报
回复
你那个资料错的。
double的对齐大小是sizeof(double),一般是8字节。
重新google 对齐,再找几篇看看。
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
画的图显示得有点问题,第一个图的斜线为填充的两个bit
第二个图为填充的一个bit
代码转载自:https://pan.quark.cn/s/c50a500cf555 在当今全球经济迅猛增长的背景下,通讯技术的持续进步使得个人之间的联系日益紧密,因此个人对其联系人信息的有效管理变得尤为重要。在此需求下,通讯录应运而生,各式各样的通讯录应用正不断为人们的生活带来便利。通讯录管理软件主要用于处理日常生活中的同学、朋友等联系人的信息编辑,帮助用户随时获取所需联系人的全部资料。这款通讯录管理系统操作简便,用户能够通过该系统轻松完成添加、检索、更新、移除等基本的管理任务。软件的操作界面通常可以隐藏在屏幕的边缘区域,当用户的鼠标移至该区域时,操作界面会自动显现,用户仅需输入关键词(如联系人姓名)即可快速找到所需的通讯录数据。 【Java课程设计-通讯录系统】是一款基于Java编程语言开发的个人通讯录管理工具,其目的是协助用户高效地处理和查找联系人信息。该系统是在JDK 1.7.0和NetBeans 6.9.1集成开发环境中构建的,提供了添加、检索、修改和删除联系人等核心功能,旨在为用户提供流畅的操作体验。 ### 一、需求分析 1. **基本功能**:系统需具备存储联系人姓名、电话、电子邮箱等核心数据的能力,并支持用户执行新增联系人、查找特定联系人、编辑现有联系人资料以及移除无用联系人等操作。 2. **搜索功能**:用户通过输入联系人姓名的关键字,系统能迅速定位到对应的联系人记录。 3. **界面友好**:界面设计需简洁明了,操作直观易用,软件窗口支持隐藏于屏幕边缘,并在鼠标接近时自动展示。 4. **数据保存**:系统必须实现联系人数据的持久化存储,确保程序关闭后数据不会丢失。 ### 二、任务分析 1. **主界面设计**:开发一个用户友好的主界...

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧