一、定义/声明方式

第一种:仅有结构体名,不定义/声明变量

  struct MyStruct

  {

   int i;
       char a[10];
       double b;
  };
第二种:有结构体名,并声明变量名
  struct MyStruct
  {
       int i;
       char a[10];
       double b;
  }structName;
  或
  struct MyStruct
  {
       int i;
       char a[10];
       double b;
  };
  struct MyStruct structName;
  //可同时定义,如struct MyStruct structName={7,“xxxxxxxxxx”,2.1};
  //也可结构体之间直接赋值,如struct MyStruct structName = structName1;
  //以上为c风格,c++中struct MyStruct structName可省略struct ,也可不省。
第三种:无结构体名,直接声明变量(对于该结构体,只需要声明一个变量)
  struct
  {
       int i;
       char a[10];
       double b;
  }structName;
第四种:带typedef
  typedef struct MyStruct
  {
       int i;
       char a[10];
       double b;
  }structName;
  则structName=struct MyStruct,structName是结构体类型的别名,不是变量。
  可以有structName aa=struct MyStruct aa; 
也可以这样:
  typedef struct
  {
       int i;
       char a[10];
       double b;
  }structName;
  可以直接structName aa,效果跟上面一样。
  typedef主要是为了省事,对于c语言定义结构体变量时总要带上struct关键字,typedef之后就不用了,而c++本身就不需要struct关键字,所以貌似也不需要typedef。

二、对齐方式

如:
  struct MyStruct
  {
    double dda1;
    char dda;
    int type;
  };
  int i = sizeof(MyStruct);

  经vs2008测试i=16,“sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13”是不对的。

  这是VC对变量存储的一个特殊处理,为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。对于上例,16=8+1+3+4,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。

又如:
  struct MyStruct
  {
         char dda;
         double dda1;
         int type;
  };
  sizeof(MyStruct)为24=1+7+8+4+4;11个字节是vc自动填充的,最后加的4是为了让结构的字节边界数为结构中占用最大空间的类型所占用的字节数的倍数。

C/C++ struct定义、声明、对齐方式的更多相关文章

  1. go关键字之struct定义声明方式

    type Student struct{ name string age int } var stu Student stu.name,stu.age = "张三”,10 stu2 := S ...

  2. <转> Struct 和 Union区别 以及 对内存对齐方式的说明

    转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...

  3. C++ 学习笔记3,struct长度測试,struct存储时的对齐方式

    之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看以下的測试: 一.在Windows7 32bit , ...

  4. cc4a-c++类定义与struct定义方式代码示范

    cc4a-c++类定义与struct定义方式代码示范 #include <iostream> #include <string> using namespace std; st ...

  5. 【CSS】定义元素的对齐方式

    1.文本内容居中对齐:text-align.扩展用法:父元素嵌套子元素时,且子元素的宽度小于父元素宽度,使用text-align:center,可以实现子元素的居中对齐. <!DOCTYPE h ...

  6. C语言中内存对齐方式

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  7. C语言的struct/union字节对齐

    C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...

  8. 关于arm处理器 内存编址模式 与 字节对齐方式 (转)

    转自:http://bavon.bokee.com/5429805.html 在x86+Linux上写的程序,在PC机上运行得很好.可是使用ARM的gcc进行交叉编译,再送到DaVinci目标板上运行 ...

  9. 关于结构体内存对齐方式的总结(#pragma pack()和alignas())

    最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...

随机推荐

  1. Vue中-下拉框可以选择可以填写

    <el-form-item label="方法名称"> <el-autocomplete popper-class="my-autocomplete&q ...

  2. Office 如何打印彩色照片能取得较好的效果

    1 如下图所示,随便打开一个照片,点击打印,纸张大小,质量,纸张类型如下所示.   2 这样打印的设置还是不够的,因为"高级光面纸"或者类似的纸张类型,会把色彩浓度调大,相对于普通 ...

  3. ie 代理设置中地址和端口置灰的解决办法

    @echo offecho 代理设置reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings&quo ...

  4. windows安装Python模块:requests

    个人在windows10安装python模块requests如下过程: 1.下载requests模块:首先打开powershell, cd到你要下载文件的位置(我的是d:\softwareinstal ...

  5. openwrt-安装-驱动-应用-lcd2004a实验

    1. 板子f403tech的RT5350的板子和 (1)openWRT系统的定义和特点         OpenWrt是一个高度模块化.高度自己主动化的嵌入式Linux系统.拥有强大的网络组件.经常被 ...

  6. 【bzoj2748】[HAOI2012]音量调节

    设F[i][j]表示在第i首歌曲结束后,音量能否刚好为j 转移:F[i][j]=F[i][j-C[i]] or F[i][j+C[i]] 初始化:F[0][beginlevel]=true 最后在所有 ...

  7. GraphDatabase_action

    https://neo4j.com/docs/ #https://pypi.python.org/pypi/neo4j-driver/1.5.3from neo4j.v1 import GraphDa ...

  8. ARM+linux系统移植3G拨号上网收发短信(三)【转】

    本文转载自:http://blog.csdn.net/hanmengaidudu/article/details/17099755 一.用text查看模式下面的“发”是指我敲的命令,“收”是指回车后显 ...

  9. ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办?

    一不小心,修改了/etc/sudoers文件. 惨了. 无法使用sudo了,啥都干不成了. 最最关键的是,也无法用root登录. 本想着要重装系统了. 后来发现了神奇的ubuntu安全模式. 1.重启 ...

  10. preparing launch delegate问题

    启动tomcat成功,但是右下角一直显示100%点进去 发现preparing launch delegate卡在100% 以为是代理的事,把代理关了,还是不行,最后发现是数据库没有,导入数据库后完美 ...