1、C++中struct与class的区别
- struct默认的访问控制权限是public,而class中默认的访问控制权限是private
- 在继承关系中,struct默认是公有继承,而class是私有继承。
- class关键词可以用于定义模板参数,和typename一样。但关键词struct不能用于定义模板参数。
2、说说C++ struct和C struct的区别
- C的结构体内不允许有函数存在,C++允许有内部函数,且允许该函数是虚函数。
- C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
- C语言的结构体是不可以继承的,C++的结构体是可以从类或其他的结构体继承过来。
- C结构体在定义时除非使用typedef取别名,否则之后定义变量都必须跟上struct + 结构体名,而C++结构体可以直接使用结构体名,不受限制。
// main.c
typedef struct Complex{
int real;
int image;
}Complex;
那么,在说明Complex变量的时候可以这样写Complex complex;
,但是如果没有typedef就必须用struct Complex complex;
来声明。
3、结构体(struct)和联合体(union)的区别
- 结构体中的每个成员都有自己独立的地址,它们是同时存在的;而共同体中的所有成员占用同一段内存,它们不能同时存在;
- 在不考虑字节对齐的情况下,struct变量的总长度等于所有成员长度之和。union变量的长度等于最长的成员的长度。
- struct的不同成员赋值是互不影响的;而对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了。
4、如何判断大端还是小端
在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低地址。
写程序判断其实也是这样的思路:想办法取出一个字节的内容,就可以知道是哪种存储方式。
#include<cstdio>
using namespace std;
// 结构体方法判断
void func1()
{
union Data
{
int i;
char ch;
}un;
un.i = 1;
if (un.ch == 1)
printf("little-endian\n");
else
printf("big-endian\n");
}
// 指针方法判断
void func2()
{
int a = 1;
char *p = (char *)(&a);
if (*p == 1)
printf("little-endian\n");
else
printf("big-endian\n");
}
int main()
{
func1();
func2();
}
blog — https://blog.csdn.net/zcc1229936385/article/details/109638228
6、什么是字节对齐?为什么要字节对齐?
- 为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”,比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除,也即“对齐”跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。
- 为什么要字节对齐?
(1)需要字节对齐的根本原因在于CPU访问数据的效率问题。
(2)一些系统对对齐要求非常严格,比如MIPS系统,如果取未对齐的数据会发生错误,而在x86上就不会出现错误,只是效率下降。
union example {
int a[5];
char b;
double c;
};
int result = sizeof(example); //24
// 原则1:union中变量共用内存,而且以最长的为准
// 原则2:占用的内存空间大小需要是结构体中占用最大内存空间的类型的整数倍。
struct example {
int a[5];
char b;
double c;
}test_struct;
int result = sizeof(test_struct); //32
struct example {
char b;
double c;
int a;
}test_struct;
int result = sizeof(test_struct); //20
// 原则1:字节对齐要求内存起始地址是数据类型的整数倍
// 原则2:占用的内存空间大小需要是结构体中占用最大内存空间的类型的整数倍
---
#pragma pack(4)
struct example{
char a;
double b;
int c;
}test_struct;
sizeof(test_struct); //16
#pragma pack(4)
using namespace std;
struct example{
char a;
double b;
char c;
}test_struct;
sizeof(test_struct); //16
#pragma pack(4)
using namespace std;
struct example{
int a;
char b;
short int c;
char d;
}test_struct;
sizeof(test_struct); //12
#pragma pack(8)
using namespace std;
struct example{
int a;
char b;
short int c;
int d;
}test_struct;
sizeof(test_struct); //12
#pragma pack(n)表示,我们结构体成员所占用内存的起始地址需要是n的整数倍。
规则一:对齐字节数 = min(成员起始地址应是n的倍数时填充的字节数, 自然对齐时填充的字节数)。
规则二:同时满足占用的内存空间大小需要是结构体中占用最大内存空间的类型的整数倍。(当与规则一冲突时,优先考虑规则一)
struct {
char b;
double c;
int a;
}__attribute__((packed)) test_struct; //取消对齐
sizeof(test_struct); //13