C++:静态断言内存对齐

news2024/11/22 16:14:37

静态断言

  • C中的断言assert
    (1)直接参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html
    (2)C的assert是运行时检测发现错误,而不是编译时
    (3)C在编译时错误用#error来输出
  • C++静态断言
    (1)C++引入static_assert(表达式, “提示字符串”)来实现编译时的静态断言
    (2)实例演示
#include <iostream>
#include <type_traits>

// 编译期常量表达式
constexpr int factorial(int n) {
    return (n <= 1) ? 1 : (n * factorial(n - 1));
}

int main() {
    // 编译时断言:检查某些条件是否成立
    static_assert(sizeof(int) == 4, "int 类型的大小不是 4 字节");
    static_assert(factorial(5) == 120, "Factorial 计算错误");
    
    std::cout << "所有静态断言均通过。" << std::endl;

    return 0;
}

#include <iostream>
#include <cassert>

int factorial(int n) {
    assert(n >= 0); // 断言n是非负数
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

int main() {
    int num1 = 5;
    int num2 = -3;

    // 正常情况
    std::cout << "Factorial of " << num1 << " is " << factorial(num1) << std::endl;

    // 异常情况(将触发断言)
    std::cout << "Factorial of " << num2 << " is " << factorial(num2) << std::endl;

    return 0;
}

  • 静态断言主要用途
    (1)static_assert主要用于检查模板参数是否符合期望
    (2)C++20中引入了concept来进一步更好的实现模板参数的编译时类型匹配检查

内存对齐

  • C语言中内存对齐关键点
    (1)#pragma 和 attribute((packed)) attribute((aligned(n)))
#include <stdio.h>

// 使用 #pragma pack 控制对齐
#pragma pack(push, 1) // 设置为1字节对齐

typedef struct {
    char c;
    int i;
    double d;
} PackedStruct;

#pragma pack(pop) // 恢复默认对齐

// 使用 __attribute__((packed)) 控制对齐
typedef struct {
    char c;
    int i;
    double d;
} __attribute__((packed)) PackedStructAttribute;

// 使用 __attribute__((aligned(n))) 控制对齐
typedef struct {
    char c;
    int i;
    double d;
} AlignedStruct __attribute__((aligned(16)));

int main() {
    PackedStruct ps;
    PackedStructAttribute psa;
    AlignedStruct as;

    printf("Size of PackedStruct: %zu bytes\n", sizeof(PackedStruct));
    printf("Size of PackedStructAttribute: %zu bytes\n", sizeof(PackedStructAttribute));
    printf("Size of AlignedStruct: %zu bytes\n", sizeof(AlignedStruct));

    printf("Address of ps.c: %p\n", (void*)&ps.c);
    printf("Address of ps.i: %p\n", (void*)&ps.i);
    printf("Address of ps.d: %p\n", (void*)&ps.d);

    printf("Address of psa.c: %p\n", (void*)&psa.c);
    printf("Address of psa.i: %p\n", (void*)&psa.i);
    printf("Address of psa.d: %p\n", (void*)&psa.d);

    printf("Address of as.c: %p\n", (void*)&as.c);
    printf("Address of as.i: %p\n", (void*)&as.i);
    printf("Address of as.d: %p\n", (void*)&as.d);

    return 0;
}

在这里插入图片描述

  • C++中内存对齐新增关键字
    (1)alignof (C++11 起) 查询对齐要求
    (2)alignas (C++11 起)设置对齐,效果:和__attribute__((aligned(n)))效果一样,往大了设置有用
#include <iostream>
#include <cstddef> // for std::size_t

// 使用 alignas 设置对齐
struct alignas(16) AlignedStruct {
    char c;
    int i;
    double d;
};

// 未对齐的结构体
struct UnalignedStruct {
    char c;
    int i;
    double d;
};

int main() {
    // 使用 alignof 查询对齐要求
    std::cout << "Alignment of char: " << alignof(char) << std::endl;
    std::cout << "Alignment of int: " << alignof(int) << std::endl;
    std::cout << "Alignment of double: " << alignof(double) << std::endl;

    std::cout << "Alignment of AlignedStruct: " << alignof(AlignedStruct) << std::endl;
    std::cout << "Alignment of UnalignedStruct: " << alignof(UnalignedStruct) << std::endl;

    // 打印结构体大小
    std::cout << "Size of AlignedStruct: " << sizeof(AlignedStruct) << std::endl;
    std::cout << "Size of UnalignedStruct: " << sizeof(UnalignedStruct) << std::endl;

    // 分配对齐的内存
    void* ptr = aligned_alloc(alignof(AlignedStruct), sizeof(AlignedStruct));
    if (ptr) {
        std::cout << "Memory allocated at address: " << ptr << std::endl;
        free(ptr); // 记得释放内存
    } else {
        std::cerr << "Memory allocation failed!" << std::endl;
    }

    return 0;
}

在这里插入图片描述

  • 什么情况下需要人为改变/指定对齐方式
    (1)往大去对齐。有时候会有一些硬件特殊要求,譬如MMU,cache等。用__attribute__((aligned(n)))实测ok,用#pragma实测不ok
    (2)往下去对齐。有时候需要节省内存而浪费效率,所以希望忽略内存对齐,紧密排放。用#pramgma实测ok,用__attribute__((aligned(n)))实测不ok

总结

了解static_assert的使用方法
了解alignof 、alignas,可以实现内存对齐

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据集][目标检测]婴儿状态睡觉哭泣检测数据集VOC+YOLO格式7109张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7109 标注数量(xml文件个数)&#xff1a;7109 标注数量(txt文件个数)&#xff1a;7109 标注…

【MySQL基础篇】SQL指令:DQL及DCL

1、DQL DQL - 介绍 DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据表中的记录。&#xff08;在MySQL中应用是最为广泛的&#xff09; 查询关键字&#xff1a;SELECT DQL - 语法 SELECT 字段列表 FROM 表名列表 WHER…

代码随想录算法训练营第四十七天| 188.买卖股票的最佳时机IV ,309.最佳买卖股票时机含冷冻期 ,714.买卖股票的最佳时机含手续费

188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int k, int[] prices) {int[][] dp new int[prices.length][2*k];for(int i0;i<2*k;i){if(i%2 0){dp[0][i] -prices[0];}else{dp[0][i] 0;} }for(int i1;i…

LeetCode题练习与总结:环形链表Ⅱ--142

一、题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测…

C语言 | Leetcode C语言题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* reverseList(struct ListNode* head) {if (head NULL || head->next NULL) {return head;}struct ListNode* newHead reverseList(head->next);head->next->next head;head->next NULL;return newHea…

Camera Raw:增强

Camera Raw 中的增强 Enhance命令基于 AI 技术提升图像的质量&#xff0c;可用于降噪、生成清晰的细节以及提高图像的分辨率。 ◆ ◆ ◆ 主要用途 1、高 ISO 图像降噪 勾选“去杂色” Denoise&#xff0c;可轻松消除使用高 ISO 设置或在低光环境下拍摄的照片中的噪点。 可以对…

Nettyの粘包、半包问题框架解决方案自定义协议

1、Netty框架是如何解决粘包、半包问题 关于粘包&#xff0c;半包问题&#xff0c;在前面几篇中都有提及&#xff0c;我们简单的复习一下。 粘包指的是客户端发出的多条消息&#xff0c;被服务端当做一条进行接收。半包指的是客户端发出一条完整的消息&#xff0c;在传输的过程…

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…

boston房价预测--机器学习Boston数据分析

1.采用散点图绘制相关性。 #分析波士顿房价数据集的数据相关性 import numpy as np import pandas as pd import matplotlib.pyplot as plt #载入数据集 data_url "http://lib.stat.cmu.edu/datasets/boston" raw_df pd.read_csv(data_url, sep"\s", …

Java数据结构6-栈与队列

1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则 压栈…

第11章 规划过程组(11.5创建WBS)

第11章 规划过程组&#xff08;一&#xff09;11.5创建WBS&#xff0c;在第三版教材第380~383页&#xff1b; 文字图片音频方式 视频22 第一个知识点&#xff1a;主要输入 1、项目管理计划 范围管理计划 定义了如何根据项目范围说明书创建WBS2、项目文件 项目范围说明…

Uboot重定位

Uboot重定位 一、重定位的意义二、介绍一些重定位相关的表项结构(节)三、uboot的重定位过程:一、重定位的意义 uboot的重定位有两次,第一次是在编译成镜像后,在makefile中调用进行处理的,其调用tools/riscv_prelink.c的代码进行重定位处理(主要就是对重定位表中的R_RIS…

为什么IP地址会被列入黑名单?

您是否曾经历过网站访客数量骤减或电子邮件投递失败的困扰&#xff1f;这背后或许隐藏着一个常被忽略的原因&#xff1a;您的IP地址可能已经被列入了黑名单内。尽管您并没有进行任何违法的网络操作&#xff0c;但这个问题依然可能出现。那么&#xff0c;究竟黑名单是什么&#…

巴黎成为欧洲AI中心 大学开始输出AI创始人

来自Dealroom 的数据显示&#xff0c;在欧洲和以色列AI创业公司中&#xff0c;法国的AI创业公司资金最充裕。Mistral、Owkin、Hugging Face等法国企业已经融资23亿美元&#xff0c;比英国、德国AI创业公司都要多。 一名大学生走出校门凭借聪明才智和一个黄金点子成为富豪&#…

36.基于多目标螳螂优化算法的微电网优化matlab

微♥关注“电击小子程高兴的MATLAB小屋”获取资源 基于螳螂优化算法的多目标优化算法 求解微电网多目标优化调度 比较不同目标函数寻优对调度结果的影响 第1种.将两个目标函数值归一化相加&#xff0c;取相加后最小的目标值的粒子&#xff0c;即寻找折衷解并画图 第2种寻找…

Matlab|【需求响应】空调负荷需求响应模型

1主要内容 程序主要复现《溫控负荷的需求响应潜力评估及其协同优化管理研究_谢敦见》2.5部分章节的内容&#xff0c;建立空调负荷的聚合模型&#xff0c;考虑调节空调温度对空调响应潜力的影响&#xff0c;程序结果充分说明随着上调温度增大&#xff0c;响应程度逐渐增大。 具…

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(更新中)

漏洞简介 参考内容&#xff1a; CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 | Math & Sec &#xff0c;HACHp1的个人博客 CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析_openwrt 图形界面-CSDN博客 exploits/CVE-2019-12272 at master oreosES/exp…

PDF处理篇:如何调整 PDF 图像的大小

将视觉效果无缝集成到 PDF 中的能力使它们成为强大的通信工具。然而&#xff0c;笨拙的图像大小会迅速扰乱文档的流程&#xff0c;阻碍清晰度和专业性。幸运的是&#xff0c;GeekerPDF 和Adobe Acrobat等流行的应用程序提供了用户友好的解决方案来应对这一挑战。这个全面的指南…

螺旋矩阵问题C代码

给定一个n行m列的二维数组&#xff0c;要求按顺时针螺旋顺序输出矩阵中的所有元素&#xff0c;n和m小于等于10 如下图是一个三行四列的螺旋矩阵 要求输出 1 2 3 4 8 12 11 10 9 5 6 7 全局变量定义 int a[11][11]; int vis[11][11]; // 访问标记数组关键代码如下 int dx[] …

原生APP开发的特点分析

原生APP开发是指使用官方提供的开发语言和工具&#xff0c;针对特定的移动平台进行应用程序开发。例如&#xff0c;Android平台的原生APP开发使用Java或Kotlin语言&#xff0c;iOS平台的原生APP开发使用Objective-C或Swift语言。北京木奇移动技术有限公司&#xff0c;专业的软件…