当前位置:  技术问答>linux和unix

结构体占用内存大小的问题

    来源: 互联网  发布时间:2015-05-16

    本文导语:  各位大侠:     最近碰到一个很奇怪的问题,我定义了一个结构体。定义如下: struct imagePacketInfo { char corpID[10]; char terminalType[10]; char picFormat[10]; long cameraID; long picID; long totalPks; long curPkID; long dataLen; cha...

各位大侠:
    最近碰到一个很奇怪的问题,我定义了一个结构体。定义如下:
struct imagePacketInfo
{
char corpID[10];
char terminalType[10];
char picFormat[10];
long cameraID;
long picID;
long totalPks;
long curPkID;
long dataLen;
char *data;
};

    我觉得这个结构体的大小应该是54字节,但是sizeof(struct imagePacketInfo)
却是56,这是为什么?请各位指点

|
字节对齐在不同的机器上处理会不一样的,这样的话相同的结构体在不同的机器上分配的空间可能会不一样。
字节对齐使计算机在内存读取时可以更为高效,计算机体系结构的书籍上面有介绍

如果结构体只在一种平台上使用(比如windows),可以直接使用,不必关心内部如何对齐。
如果结构体会出现在多个平台上(例如前台windows,后台linux),这种就要小心了,否则由于两边对齐方式的不同就会出问题。有一种简单的办法就是打开
#pragma pack(1)
的编译选项,强制单字节对齐,这样结构体的大小就固定了,中间不会添加多余的字节。
#pragma pack()可以恢复默认的对齐方式

我一般在定义通讯使用的结构体时都是这样的

#pragma pack(1)
typedef struct {
char a;
int b;
} ST_CC;
...

#pragma pack()

不过要求编译器支持#pragma这个编译选项,VC6和gcc是支持的
如果不支持的话,就只有搞清楚对齐的处理,在系统会添加多余的对齐字节的地方人为的添加上相应的字节,确实很麻烦,而且结构体不能轻易修改,牵一发会动全身的

|

char corpID[10];
char terminalType[10];
char picFormat[10];
//会自动在这里插入两个字节,构成32字节,4的倍数。
long cameraID;
long picID;
long totalPks;
long curPkID;
long dataLen;
char *data;

|
那是对齐问题,int需要4字节对齐,short是2字节,char就无所谓了。

|
struct info
{
    char str1;
    //应该在这里加入了一个字节:)
    uint16_t length;
}
可以参考thinking in c++
所有的变量编译时自动在变量大小的边界处对齐!
 &(struct info *)0->length = 2

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • !!谁知道结构体怎么分配内存,VIVI中
  • 结构体数组映射到共享内存区的问题
  • 二叉树全局结构变量分配内存的释放问题
  • struct 结构内存对齐问题.
  • linux下,如何在内存指定位置定一个结构体对象。
  • unix下,如何使得结构按1字节进行内存对齐?
  • 共享内存存取结构体
  • C/C++语言中结构体的内存分配小例子
  • C语言 结构体动态数组内存释放问题
  • Oracle专用服务器的内存结构分布原则
  • <<大话数据结构>>中冒泡排序算法改进
  • 请问:在用proc方式往数据库插入数据时,我能不能定义一个结构体,它与表的每一项对应,将结构体赋好值后,再只将这个结构体插入表中,这行不行啊?
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • 全局结构体变量和全局结构体指针变量
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 《arm体系结构结构与编程》书如何
  • 数据结构:图(有向图,无向图),在Python中的表示和实现代码示例
  • file结构和inode结构
  • mysql 命令大全及导入导出表结构或数据
  • 《莱昂氏UNIX源代码分析》中有一种结构体声明没有结构体名
  • 关于学籍管理系统B/S结构实现的结构问题
  • GCC 编译问题: 结构A中有个成员结构B??
  • 强人,linux下驱动相关数据结构和usb设备数据结构之间的功能分析
  • 谁能告诉我EJB的体系结构有哪些,这些体系结构的优缺点如何,万分感谢!
  • 协议的设计一般采用结构体进行数据打包,在协议设计的结构体中能不能使用指针 ?
  • struct __una_u16结构是什么结构.
  • GNU汇编fill填充一个数据结构使得另一个数据结构全部清零
  • 高手帮帮忙!vi中如何实现跳转到任意结构体或函数的声明处,包括系统库中声明的函数和数据结构?
  • jbuilder7里如何在project pane里显示出某个project的所有的类的结构图,就如显示source java files的结构图一样
  • 关于客户服务器结构与浏览器服务器结构编程的比较
  • 有一个win32的结构体,大伙看看能否转换成linux下的基本等价的结构体?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3