news 2026/5/12 17:58:05

八股文随记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
八股文随记

字节对齐

规则

成员对齐:结构体第一个成员偏移量为 0,后续成员的起始地址必须是指定对齐大小的整数倍。如果不满足,插入填充字节;
整体对齐:结构体的总大小必须是结构体中最大成员大小的整数倍。如果不够,末尾补全;
顺序影响:成员的声明顺序直接影响内存占用。将占用空间大的成员放在前面通常能减少填充

语法

alignof:查询对齐要求

#include<cstddef>// 查询对齐要求size_t align=alignof(int);// C++11// 动态对齐分配alignas(16)charbuffer[1024];auto*ptr=new(buffer)alignas(16)MyClass();// 对齐检查boolisAligned=(reinterpret_cast<uintptr_t>(ptr)%16==0);

alignas:强制指定对齐

structalignas(16)AlignedStruct{charc;inti;// 整个结构体按16字节对齐};structCustomAlign{charc;alignas(8)inti;// i按8字节对齐shorts;};

#pragma pack

#pragmapack(1)// 按1字节对齐(紧凑模式)structPack1{charc;// 1字节inti;// 4字节,紧跟在c后面shorts;// 2字节};#pragmapack()// 恢复默认对齐#pragmapack(2)// 按2字节对齐structPack2{charc;// 1字节inti;// 4字节,偏移量对齐到2的倍数shorts;// 2字节};#pragmapack()#pragmapack(push,1)// 保存当前对齐值并设置为1structPackPush{charc;inti;shorts;};#pragmapack(pop)// 恢复之前的对齐值

attribute((aligned))(GCC/Clang)

struct__attribute__((aligned(16)))GCCAligned{charc;inti;};structGCCPacked{charc;inti;shorts;}__attribute__((packed));// 紧凑排列

原因

  • 可移植性:某些硬件架构不支持访问非对齐的内存地址,强行访问,CPU 会抛异常;
  • 性能优化:现代 CPU 读取内存通常 4 或 8 字节进行;
    • 对齐访问:一次内存总线周期即可读完数据;
    • 非对齐访问:如果一个 int 跨越了两个 4 字节边界,CPU 需要进行两次读取操作并进行拼接,效率大幅降低;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 17:51:06

C#基础9泛型

一、 泛型 :允许我们延迟编写数据类型&#xff0c; 直到真正使用时确定类型的一种规范方法本质上也是数据类型泛型&#xff1a;体现多态&#xff0c;与var相似1.可以创建自己的泛型接口、泛型类、泛型方法、泛型集合 &#xff0c;泛型事件和泛型委托2.泛型的格式: 结构<泛…

作者头像 李华
网站建设 2026/5/12 17:50:05

【新手避坑】Keil5从零到一:手把手搭建你的第一个STM32工程

1. 为什么选择Keil5开发STM32&#xff1f; 第一次接触STM32开发的朋友&#xff0c;肯定会被各种开发环境搞得眼花缭乱。我刚开始学的时候也纠结过&#xff0c;到底用IAR、Keil还是直接用VSCode插件&#xff1f;后来发现Keil MDK&#xff08;也就是常说的Keil5&#xff09;是最适…

作者头像 李华