记录实训第二天

1、在ubuntu上安装了搜狗输入法linux-安装指导,方便输入中文。其中还发现了鼠标从主机移动到虚拟机时会隐藏的问题,调整了虚拟机->管理->USB控制器,改成了USB3.0,问题解决。

2、结构体的内存对齐。强制对齐alignas是没有效果的(因为是强制最小对齐),prama是有效果的(设置最大对齐)。

因为在 C++ 里,alignas用于规定类型或者变量的对齐要求。不过,它得遵循两条重要规则:

  1. 成员变量的起始地址必须是其自身对齐值的整数倍。
  2. 类型的整体对齐值由其最大成员的对齐值决定,除非使用 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
        
    }

对齐规则总结

  1. 基本类型对齐:每个成员的偏移量必须是其类型对齐值的倍数
  2. 结构体对齐:整体大小必须是最大成员对齐值的倍数
  3. 嵌套结构体:嵌套结构体的起始偏移必须是其最大成员对齐值的倍数,且自身大小需调整为其最大对齐值的倍数

为什么需要对齐?

  • 硬件限制:某些 CPU 架构(如 ARM、PowerPC)要求数据必须对齐,否则会触发异常(Misalignment Fault)。
  • 性能优化:对齐的数据访问更快。例如,未对齐的uint32_t可能需要两次内存读取,而对齐的只需一次。

3、虚函数表

构建子类的时候,会把基类的虚函数表指向派生类。

Animal funcDogfunc
sayAnimal::say()sayDog::say()
析构~Animal析构~Dog
虚函数表的指针

重定义 全局变量

定义 (Definition) vs 声明 (Declaration)

placement new 技术构建类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值