1、在ubuntu上安装了搜狗输入法linux-安装指导,方便输入中文。其中还发现了鼠标从主机移动到虚拟机时会隐藏的问题,调整了虚拟机->管理->USB控制器,改成了USB3.0,问题解决。
2、结构体的内存对齐。强制对齐alignas是没有效果的(因为是强制最小对齐),prama是有效果的(设置最大对齐)。
因为在 C++ 里,alignas用于规定类型或者变量的对齐要求。不过,它得遵循两条重要规则:
- 成员变量的起始地址必须是其自身对齐值的整数倍。
- 类型的整体对齐值由其最大成员的对齐值决定,除非使用 alignas进行了显式的修改,但这个显式指定的值不能小于最大成员的对齐值。
借助 #prama pack能够改变编译器的默认对齐规则,进而强制执行特定的对齐方式。#prama pack是编译器特有的指令,其作用是按照指定的字节数对结构体进行紧凑排列。
//内存对齐
{
struct Data
{
uint8_t a; //align 1 offset 0
uint32_t b; //align 4 offset 4
uint64_t c; //align 8 offset 8
struct //align 2 offset 16
{
float d; //align 4 offset 16
uint16_t e;//align 2 offset 20
};
};
Data data;
uint64_t dataSize = sizeof(Data);
uint64_t dataAlign = alignof(Data);
std::cout << dataSize << " "<<dataAlign<<std::endl; //24 8
//#pragma pack(2)
struct alignas(2) Data2
{
int a; //align 2 offset 0
uint64_t b; //align 2 offset 4
uint8_t c; //align 2, offset 12
};
//#pragma pack()
Data data2;
uint64_t data2Size = sizeof(Data2);
uint64_t data2Align = alignof(Data2);
std::cout << data2Size<< " " << data2Align<<std::endl; //24 8
}
对齐规则总结
- 基本类型对齐:每个成员的偏移量必须是其类型对齐值的倍数
- 结构体对齐:整体大小必须是最大成员对齐值的倍数
- 嵌套结构体:嵌套结构体的起始偏移必须是其最大成员对齐值的倍数,且自身大小需调整为其最大对齐值的倍数
为什么需要对齐?
- 硬件限制:某些 CPU 架构(如 ARM、PowerPC)要求数据必须对齐,否则会触发异常(Misalignment Fault)。
- 性能优化:对齐的数据访问更快。例如,未对齐的
uint32_t可能需要两次内存读取,而对齐的只需一次。
3、虚函数表
构建子类的时候,会把基类的虚函数表指向派生类。
| Animal | func | Dog | func |
| say | Animal::say() | say | Dog::say() |
| 析构 | ~Animal | 析构 | ~Dog |
| 虚函数表的指针 |
重定义 全局变量
定义 (Definition) vs 声明 (Declaration)
placement new 技术构建类

1067

被折叠的 条评论
为什么被折叠?



