C/C++ struct定义、声明、对齐方式
一、定义/声明方式
第一种:仅有结构体名,不定义/声明变量
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定义、声明、对齐方式的更多相关文章
- go关键字之struct定义声明方式
type Student struct{ name string age int } var stu Student stu.name,stu.age = "张三”,10 stu2 := S ...
- <转> Struct 和 Union区别 以及 对内存对齐方式的说明
转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...
- C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看以下的測试: 一.在Windows7 32bit , ...
- cc4a-c++类定义与struct定义方式代码示范
cc4a-c++类定义与struct定义方式代码示范 #include <iostream> #include <string> using namespace std; st ...
- 【CSS】定义元素的对齐方式
1.文本内容居中对齐:text-align.扩展用法:父元素嵌套子元素时,且子元素的宽度小于父元素宽度,使用text-align:center,可以实现子元素的居中对齐. <!DOCTYPE h ...
- C语言中内存对齐方式
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...
- C语言的struct/union字节对齐
C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...
- 关于arm处理器 内存编址模式 与 字节对齐方式 (转)
转自:http://bavon.bokee.com/5429805.html 在x86+Linux上写的程序,在PC机上运行得很好.可是使用ARM的gcc进行交叉编译,再送到DaVinci目标板上运行 ...
- 关于结构体内存对齐方式的总结(#pragma pack()和alignas())
最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...
随机推荐
- iOS_开发中遇到的那些问题_1
[自编号:60][AutoLayout中,怎样让ImageView保持固定的宽高比?比如1:1] 先将imageViewframe手动写成:宽20,高20,再勾选Aspect Ratio加入宽高比约束 ...
- OpenLayers 3+Geoserver+PostGIS实现点击查询
WebGIS开发中,点击查询是最经常使用的一种查询方式,在ArcGIS api 中.这样的查询叫IdentifyTask,主要作用是前台提交參数.交ArcServer查询分析返回. 本文从开源框架的角 ...
- 单一责任原则(SRP)
1.就一个类而言,应该仅有一个引起它变化的原因. 2.在SRP中定义职责为:“变化的原因”. 如果你想到多个动机去改变这个类,那这个类就有多个职责
- 『GCD』详解
2. GCD 任务和队列 学习 GCD 之前,先来了解 GCD 中两个核心概念:任务和队列. 任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码.在 GCD 中是放在 block 中的.执 ...
- 二分lower_bound()与upper_bound()的运用
<span style="color:#6633ff;">/* G - 二分 Time Limit:2000MS Memory Limit:32768KB 64bit ...
- Bootstrap button源码分析
/* ======================================================================== * Bootstrap: button.js v ...
- 【168】ENVI入门系列
参考:ENVI-IDL中国的博客 [ENVI入门系列]01.ENVI产品简介与入门 [ENVI入门系列]02.自定义坐标系(北京54.西安80.2000坐标系) [ENVI入门系列]03.基于自带定位 ...
- conda命令不能用的问题
在Windows下安装了Anaconda3-5.0.1-Windows-x86.exe 但是在cmd端下,打命令conda没反应 打pip显示如下错误 这是由于cmd编码为gbk的问题导致的 解决方案 ...
- 《Maven实战》(许晓斌)导读(读书笔记&第二次读后感)
第一章 Maven简介 Maven是构建工具,但同时还是jar包管理工具.项目信息管理工具 与Make.Ant比较,更为先进 第二章 Maven的安装和配置 Windows和Unix上安装都很简单,下 ...
- Asp.Net 开发实战技术
1.什么是WMI技术 WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程:设 ...