2018-01-06 C++ 指针的强制转换
指针强制转换仅仅是将地址后的内容按照不同的类型进行变量解释和读取。(但是如果强制转换的指针所指向数据的字节数不一样,会存在数据错误。比如:一个指向char型数据的指针p,p指向的内容只有一个字节,*p是将地址后面的一个字节的内容按照char进行解读取;但是如果将其强制转换成int型指针*pn,*pn将地址后面的四个字节的内容按照int进行解读取,这样就会多读了后面的内存,出现错误。
结构体的大小计算和内存对齐
结构体的成员占用不同的存储空间,当计算结构体占用内存空间时,并不是简单的相加。
偏移量: 结构体变量成员地址和结构体变量地址的差
结构体大小等于最后一个成员的偏移量 加上最后一个成员的大小
实际上,偏移量会被调整,调整规则如下:
1. 偏移量必须是当前成员大小的整数倍
2.结构体大小是所有成员大小的整数倍(各项)
例子 struct a {
int i, // 偏移量为 0
char c; // c 的偏移量为4
int j}; //j 的偏移量为 5 需要调整到 8 才成为 size(j)的整数倍
size(a) = 4 +1 + 4+3 = 12 满足规则2
例子:
struct st_task{
uint16_t id;
unint32_t value;
uint64_t timestamp;
};
uint64_t a = 0x 00 00 00 00 00 01 00 01;
memcpy(&task,&a,size0f(uint64_t)
a 在内存的存储有两种形态:
1. 大端模式, 低地址高字节
00 00 00 00 00 01 00 01 从左到右低地址到高地址
2.小段模式 低地址低字节
10 00 10 00 00 00 00 00
st_task 的大小分析
struct st_task{
uint16_t id; // 0
unint32_t value; // 2 但是成员大小为4 , 因此要补充成4偏移量。
uint64_t timestamp; // 4 + size(uint32_t) =8 偏移量, 不用修改。
};
8+ 8 = 16 满足规则2
在小端模式下, id 被赋值为 1000 value 被赋值为 00 00 00 00 ( 10 00 被跳过了),( 16 - )timestamp 没被赋值默认为 0 , 使用小端模式存储的字节转换为实际值后,id 变为 0x0001