首页 > 系统相关 >【C/C++】结构体内存对齐

【C/C++】结构体内存对齐

时间:2024-07-15 17:43:36浏览次数:8  
标签:整数倍 内存 默认 访问 C++ 对齐 体内 结构

结构体内存对齐详解

1、第一个成员在与结构体变量偏移量为0的地址处
2、其他成员变量要偏移到 对齐数 的整数倍的地址处 ,注意 偏移是从结构体首地址处开始的。

    对齐数 取的是 编译器默认的一个对齐数 与 该成员大小 这个俩个数中的最小值。

   【VS中默认的值为8、Linux环境默认不设对齐数(对齐数是结构体成员自身的大小)】
3、结构体总大小  为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

 为什么要进行内存对齐? 

1、是平台本身的原因,任意地址上的任意数据是不能随意访问的,如果不正确访问可能会造成硬件异常。

2、是性能原因,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问 

 

如何让结构体按照指定的对齐参数进行对齐?

  需要使用一个预处理指令#pragma pack

具体用例

1 #pragma pack(1)//设置默认对齐数为1
2 struct S1
3 {
4     char c1;
5     int i;
6     char c2;
7 };
8 #pragma pack()//取消设置的默认对齐数,还原为默认
View Code

 

标签:整数倍,内存,默认,访问,C++,对齐,体内,结构
From: https://www.cnblogs.com/JOKER2255/p/18303632

相关文章

  • kimi写代码:c++ 线程池
    https://kimi.moonshot.cn/share/cqaberkdvond1bljn8sg在这个示例中:线程池创建了固定数量的工作线程。enqueue方法用于将任务添加到队列,并返回一个std::future对象,可用于获取任务的结果。每个工作线程在循环中等待任务分配,并在接收到任务后执行它。当线程完成分配的任务后......
  • 面试算法(排序)附带c++/python实现
            排序算法是面试中会经常会被问到的一类问题,如果可以掌握较多的排序算法,在面试过程中才更有机会被面试官看重哦,下面我们准备了一些常见的面试算法,并分别给出了c++和python的代码实现,小伙伴们一起学起来吧!冒泡排序(BubbleSort)        基于交换的排序,......
  • C++ STL is_sorted用法
    一:功能   检查一个区间内的元素是否有序,按升序(或降序)排列二:用法#include<algorithm>#include<iostream>intmain(){std::vector<int>data1={1,2,3,4,5};booltest1=std::is_sorted(data1.begin(),data1.end());std::cout<<std::boo......
  • Hypertable 基于C++开发编译环境部署
    一、安装gccyuminstallgccgcc-c++二、安装boostyuminstallboostboost-develboost1.42以上版本,执行以下脚本:tarxjvfboost_1_44_0.tar.bz2cdboost_1_44_0./bootstrap.sh--with-libraries=filesystem,iostreams,program_options,system,thread,graph,regex./bjam......
  • C/C++ 避免缓冲区溢出的措施
    在C/C++中,缓冲区溢出是一种常见的安全问题,可以导致程序崩溃或安全漏洞。为了避免缓冲区溢出,可以采取以下防范措施:使用安全的函数:使用strncpy(), strncat(), snprintf()等函数代替strcpy(), strcat(), sprintf()等,这些函数允许你指定最大复制的字符数,从而避免溢出。......
  • C++11标准库 未来体 <future> 梳理
    目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程:async模板函数例程:shared_future模板类<future>标准库提供了一些工具来获取异步任务(即在单独的线程中启动的函数)的返回值,并捕捉其所抛出的异常。这些值在共享状态中传递,其中异步任务可以......
  • C++11标准库 条件变量 <condition_variable> 梳理
    目录<condition_variable>condition_variable类类方法生产者消费者模型--阻塞队列单条件变量版condition_variable_any模板类区别优缺点<condition_variable>条件变量是C++11提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时......
  • 【C++BFS算法】752 打开转盘锁
    本文涉及知识点C++BFS算法LeetCode752打开转盘锁你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字:‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’。每个拨轮可以自由旋转:例如把‘9’变为‘0’,‘0’变为‘9’。每次旋转都只能旋......
  • 【NOI】C++数据结构入门之一维数组(一)数组基础
    文章目录前言一、概念1.导入2.数组2.1数组的创建2.2数组的使用二、例题讲解问题:1423-考试成绩的简单统计问题:1153-查找“支撑数”问题:1156-排除异形基因问题:1155-找找谁的身高超过全家的平均身高问题:1231-考试成绩的分布情况三、总结四、感谢前言在......
  • C++11标准库 互斥锁 <mutex> 梳理
    目录<mutex>std::call_once函数例程:使用call_once实现的单例模式std::mutex类--独占互斥锁成员函数std::recursive_mutex类--递归互斥锁使用注意:描述:std::timed_mutex类--超时互斥锁描述:成员函数:std::recursive_timed_mutex类std::lock_guard模板类函数原型:std::uniqu......