搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
2023面试高手
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
第5节 批处理编写及其示例_批处理 简单 实例
2
前端开发入门提升经验整理_前端入门
3
会Python要怎么接单兼职?怎么把它作为副业发展呢??_代写接单群
4
linux文件编辑gebit,CentOS7 linux下yum安装redis以及使用
5
SSH限制ip登陆_ssh限制ip登录
6
oracle实时同步_腾讯云TDSQL多源同步架构与特性详解
7
腾讯自研云原生数据库CynosDB发布 兼容MySQL和PostgreSQL
8
centos7 挂载 U盘/硬盘_centos7取消挂载命令
9
树莓派远程连接的四种方式(最全)
10
1045 Access denied for user ‘root‘@‘localhost‘ (using password: YES)_1045.access denved for osm root'mlocalhast'tuting
当前位置:
article
> 正文
c语言-struct的相关问题_问:在缺省(自然对界)情况下,上述结构需要多少存储
作者:2023面试高手 | 2024-02-26 01:44:36
赞
踩
问:在缺省(自然对界)情况下,上述结构需要多少存储
导读:
1. struct的巨大作用
面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说,会不会用struct,怎样用struct是区别一个开发人员是否具备丰富开发经历的标志。
在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。
经验不足的开发人员往往将所有需要传送的内容依顺序保存在char型数组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的修改。
一个有经验的开发者则灵活运用结构体,举一个例子,假设网络或控制协议中需要传送三种报文,其格式分别为packetA、packetB、packetC:
struct structA
{
int a;
char b;
};
struct structB
{
char a;
short b;
};
struct structC
{
int a;
char b;
float c;
}
优秀的程序设计者这样设计传送的报文:
struct CommuPacket
{
int iPacketType; //报文类型标志
union //每次传送的是三种报文中的一种,使用union
{
struct structA packetA;
struct structB packetB;
struct structC packetC;
}
};
在进行报文传送时,直接传送struct CommuPacket一个整体。
假设发送函数的原形如下:
// pSendData:发送字节流的首地址,iLen:要发送的长度
Send(char * pSendData, unsigned int iLen);
发送方可以直接进行如下调用发送struct CommuPacket的一个实例sendCommuPacket:
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
假设接收函数的原形如下:
// pRecvData:发送字节流的首地址,iLen:要接收的长度
//返回值:实际接收到的字节数
unsigned int Recv(char * pRecvData, unsigned int iLen);
接收方可以直接进行如下调用将接收到的数据保存在struct CommuPacket的一个实例recvCommuPacket中:
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
接着判断报文类型进行相应处理:
switch(recvCommuPacket. iPacketType)
{
case PACKET_A:
… //A类报文处理
break;
case PACKET_B:
… //B类报文处理
break;
case PACKET_C:
… //C类报文处理
break;
}
以上程序中最值得注意的是
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
中的强制类型转换:(char *)&sendCommuPacket、(char *)&recvCommuPacket,先取地址,再转化为char型指针,这样就可以直接利用处理字节流的函数。
利用这种强制类型转化,我们还可以方便程序的编写,例如要对sendCommuPacket所处内存初始化为0,可以这样调用标准库函数memset():
memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));
2. struct的成员对齐
Intel、微软等公司曾经出过一道类似的面试题:
1. #include
2. #pragma pack(8)
3. struct example1
4. {
5. short a;
6. long b;
7. };
8. struct example2
9. {
10. char c;
11. example1 struct1;
12. short e;
13. };
14. #pragma pack()
15. int main(int argc, char* argv[])
16. {
17. example2 struct2;
18. cout < 19. cout < 20. cout <<(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)
< 21. return 0;
22. }
问程序的输入结果是什么?
答案是:
8
16
4
不明白?还是不明白?下面一一道来:
2.1 自然对界
struct是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如array、struct、union等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size最大的成员对齐。
例如:
struct naturalalign
{
char a;
short b;
char c;
};
在上述结构体中,size最大的是short,其长度为2字节,因而结构体中的char成员a、c都以2为单位对齐,sizeof(naturalalign)的结果等于6;
如果改为:
struct naturalalign
{
char a;
int b;
char c;
};
其结果显然为12。
2.2指定对界
一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n大于结构体中最大成员的size,则其不起作用,结构体仍然按照size最大的成员进行对界。
例如:
#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()
当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为8。
在VC++ 6.0编译器中,我们可以指定其对界方式(见图1),其操作方式为依次选择projetct >setting >C/C++菜单,在struct member alignment中指定你要的对界方式。
图1:在VC++ 6.0中指定对界方式
另外,通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n字节边界上,但是它较少被使用,因而不作详细讲解。
2.3 面试题的解答
至此,我们可以对Intel、微软的面试题进行全面的解答。
程序中第2行#pragma pack (8)虽然指定了对界为8,但是由于struct example1中的成员最大size为4(long变量size为4),故struct example1仍然按4字节对界,struct example1的size为8,即第18行的输出结果;
struct example2中包含了struct example1,其本身包含的简单数据成员的最大size为2(short变量e),但是因为其包含了struct example1,而struct example1中的最大成员size为4,struct example2也应以4对界,#pragma pack (8)中指定的对界对struct example2也不起作用,故19行的输出结果为16;
由于struct example2中的成员以4为单位对界,故其char变量c后应补充3个空,其后才是成员struct1的内存空间,20行的输出结果为4。
3. C和C++间struct的深层区别
在C++语言中struct具有了“类” 的功能,其与关键字class的区别在于struct中成员变量和函数的默认访问权限为public,而class的为private。
例如,定义struct类和class类:
struct structA
{
char a;
…
}
class classB
{
char a;
…
}
则:
struct A a;
a.a = 'a'; //访问public成员,合法
classB b;
b.a = 'a'; //访问private成员,不合法
许多文献写到这里就认为已经给出了C++中struct和class的全部区别,实则不然,另外一点需要注意的是:
C++中的struct保持了对C中struct的全面兼容(这符合C++的初衷——“a better c”),因而,下面的操作是合法的:
//定义struct
struct structA
{
char a;
char b;
int c;
};
structA a = {'a' , 'a' ,1}; // 定义时直接赋初值
即struct可以在定义的时候直接以{ }对其成员变量赋初值,而class则不能,在经典书目《thinking C++ 2nd edition》中作者对此点进行了强调。
4. struct编程注意事项
看看下面的程序:
1. #include
2. struct structA
3. {
4. int iMember;
5. char *cMember;
6. };
7. int main(int argc, char* argv[])
8. {
9. structA instant1,instant2;
10.char c = 'a';
11. instant1.iMember = 1;
12. instant1.cMember = &c;
13.instant2 = instant1;
14.cout <<*(instant1.cMember) < 15.*(instant2.cMember) = 'b';
16. cout <<*(instant1.cMember) < 17. return 0;
}
14行的输出结果是:a
16行的输出结果是:b
Why?我们在15行对instant2的修改改变了instant1中成员的值!
原因在于13行的instant2 = instant1赋值语句采用的是变量逐个拷贝,这使得instant1和instant2中的cMember指向了同一片内存,因而对instant2的修改也是对instant1的修改。
在C语言中,当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将2个实例中的指针型成员指向了同一片内存。
在C++语言中,当结构体中存在指针型成员时,我们需要重写struct的拷贝构造函数并进行“=”操作符重载。
分类: 程序设计 | 永久链接 | 评论: 0 | 引用: 0 | 浏览: 732
struct与class的比较
[ 2005-11-02 13:13:55 | 作者: Cloudward ]
C#
一.类与结构的示例比较:
结构示例:
public struct Person
{
string Name;
int height;
int weight
C#
一.类与结构的示例比较:
结构示例:
public struct Person
{
string Name;
int height;
int weight
public bool overWeight()
{
//implement something
}
}
类示例:
public class TestTime
{
int hours;
int minutes;
int seconds;
public void passtime()
{
//implementation of behavior
}
}
调用过程:
public class Test
{
public static ovid Main
{
Person Myperson=new Person //声明结构
TestTime Mytime=New TestTime //声明类
}
}
从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?
二 .类与结构的差别
1. 值类型与引用类型
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型
类是引用类型:引用类型在堆上分配地址
堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
注:
1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
2.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
例如:结构实现接口
interface IImage
{
void Paint();
}
struct Picture : IImage
{
public void Paint()
{
// painting code goes here
}
private int x, y, z; // other struct members
}
3.内部结构:
结构:
没有默认的构造函数,但是可以添加构造函数
没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化
在结构中初始化实例字段是错误的
类:
有默认的构造函数
有析构函数
可以使用 abstract 和 sealed
有protected 修饰符
必须使用new 初始化
三.如何选择结构还是类
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
3.在表现抽象和多级别的对象层次时,类是最好的选择
4.大多数情况下该类型只是一些数据时,结构时最佳的选择
C++
在C++语言中struct具有了“类” 的功能,其与关键字class的区别在于struct中成员变量和函数的默认访问权限为public,而class的为private。
例如,定义struct类和class类:
struct structA
{
char a;
…
}
class classB
{
char a;
…
}
则:
struct A a;
a.a = 'a'; //访问public成员,合法
classB b;
b.a = 'a'; //访问private成员,不合法
许多文献写到这里就认为已经给出了C++中struct和class的全部区别,实则不然,另外一点需要注意的是:
C++中的struct保持了对C中struct的全面兼容(这符合C++的初衷——“a better c”),因而,下面的操作是合法的:
//定义struct
struct structA
{
char a;
char b;
int c;
};
structA a = {'a' , 'a' ,1}; // 定义时直接赋初值
即struct可以在定义的时候直接以{ }对其成员变量赋初值,而class则不能,在经典书目《thinking C++ 2nd edition》中作者对此点进行了强调。
struct用法深入探索
作者: Cloudward http://hi.baidu.com/wave_hq/blog/item/67252938bbc4f626b9998f40.html
本文转自
http://hi.baidu.com/%CE%AC%BC%CE%BF%C6%BC%BC_%D0%A1%CB%D5/blog/item/03d93a1ea3c0691a4134170f.html
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/2023面试高手/article/detail/143065?site
推荐阅读
article
Linux
-
struct
list
_
head
简介...
在
Linux
内核中,提供了一个用来创建双向循环链表的结构
list
_
head
。虽然linux内核是用C语言写的,但是li...
赞
踩
article
struct
list
_
head
/
LIST
_
HEAD
以及
LIST
_
HEAD
_INIT/INIT_LI...
仅仅为struct
list
_
head
相关的两个宏:#define
LIST
_
HEAD
_INIT(name) { &am...
赞
踩
article
ue4
关于
创建
动态
结构
体
的一点思考_
ue4
struct
...
前言:这大半年其实没有怎么更新博客,对于自己的博客其实大部分都是一些基础教学性质的文章,真正探索性质和比较深入的内容其实...
赞
踩
article
【
Python
】
Struct
库之
pack
和 un
pack
详解_
python
struct
u...
默认情况下,C 语言的类型以机器的本机格式和字节顺序表示,并在必要时通过填充字节来正确对齐(根据C编译器使用的规则)。选...
赞
踩
article
结构
体(
struct
)...
结构
体1.概念
结构
体(
struct
)是由一系列具有相同类型或不同类型的数据构成的数据集合。2. C语言中的
结构
体在C语言...
赞
踩
article
C
语言
中
的
结构
体(
stru
c
t
)详解_
c
语言
stru
c
t
...
C
语言
中
,
结构
体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型)。本文主要介绍关于
结构
体以下几部分。 1、...
赞
踩
article
C语言
结构
体(
struct
)最全的讲解(万字干货)_
struct
a
*b(
const
ch
a
r
*...
结构
体的定义
结构
体(
struct
)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫
结构
。
结构
体和其他类型基础数...
赞
踩
article
C
语言
结构
体(
stru
c
t
)
用法
详解_
c
语言
中的
stru
c
t
用法
...
C
语言
结构
体(
stru
c
t
)
用法
详解_
c
语言
中的
stru
c
t
用法
c
语言
中的
stru
c
t
用法
结构
...
赞
踩
article
C
语言
结构
体
(
stru
c
t
)常见使用方法_
stru
c
t
在
c
语言
中用法...
注意:盗版是不会得到修正和更新的!今天复习一下
stru
c
t
,顺便挖掘一下以前没注意的小细节:基本定义:
结构
体
,通俗讲就像...
赞
踩
article
关于C
语言
结构
体
(
stru
c
t
),你不知道的用法?(初阶篇)_
stru
c
t
在
c
语言
中用法...
C
语言
结构
体
(
stru
c
t
)最全的讲解(万字干货)_
stru
c
t
在
c
语言
中用法
stru
c
t
在
c
语言
中用法 ...
赞
踩
article
C
语言
结构
体
(Stru
c
t)_求
销售总额
的
c
语言
结构
体
...
前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型...
赞
踩
article
结构
及其
使用
struct
(
C#
)_
c#
中
struct
结构
的
用法...
结构
及其
使用
struct
(
C#
) 首先
结构
是值类型。
结构
是
使用
struct
关键字定义
的
,
结构
如下:
struct
...
赞
踩
article
全面讲解 C
语言
的
结构
体
(
struct
),
一网打尽
...
点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删
结构
体
的
定义
结构
体
...
赞
踩
article
【
C
进阶】之
结构
体
类型
(
struct
)
_
struct
类型
...
结构
体
类型
(
struct
)
_
struct
类型
struct
类型
...
赞
踩
article
struct
(
结构
体)
_
struct
结构
...
在实际问题中,一组数据往往具有不同的数据类型。 例如, 在学生登记表中,姓名应为字符型(char[]);学号可为整型(i...
赞
踩
article
C Stru
c
t
_
c
stru
c
t
.开头的属性...
https://www.w3
c
s
c
hool.
c
n/
c
/
c
-
stru
c
t
ures.html
_
c
stru
c
t
.开头的属性...
赞
踩
article
C
语言
结构
体(
stru
c
t
)
类型
的各种用法_
stru
c
t
在
c
语言
中用法...
在C
语言
中,可以定义
结构
体
类型
,将多个相关的
类型
的变量包装成为一个整体使用。在
结构
体中的变量,可以是相同、部分相同,或完...
赞
踩
article
C语言
:
关键字
---
struct
(声明
结构
体
类型
)_
struct
关键字
...
一、
struct
—简介二、
struct
—定义三、
struct
—使用方法_
struct
关键字
struct
关键字
...
赞
踩
article
C语言
结构
体
(
struct
)常见
使用
方法,
struct
...
C语言
结构
体
(
struct
)常见
使用
方法分三块来讲述:1 首先://注意在C和C++里不同在C中定义一个
结构
体
类型要用t...
赞
踩
article
C 语言
结构
体
struct
的简单介绍及用法_用
结构
数组
保存姓名
身高
体
重
手机号
...
C 语言
结构
体
,
struct
用法有时候需要多个数据,比如存储一个人的身高、
体
重、年龄、姓名等信息,该怎么存储?我们可能...
赞
踩
相关标签
1024程序员节
链表
python
c++
c语言
开发语言
数据结构
struct
结构
函数
变长结构体
结构体
数据
编程
学习