当前位置: 首页 > news >正文

内存对齐--面试常问问题和笔试常考问题

1.内存对齐的意义

C++ 内存对齐的主要意义可以简练概括为以下几点:

  1. 提高访问效率:内存对齐可以使数据在内存中以更加紧凑的方式存储,从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据,而不需要额外的字节偏移计算。

  2. 硬件要求:许多硬件平台要求数据按照一定的对齐规则存储,否则可能会导致性能下降或者错误。不符合硬件要求的数据存储方式可能会引发总线错误或性能降低。

  3. 结构体和类的正确性:在C++中,结构体和类中的成员变量通常按照编译器的默认对齐方式进行排列,以确保数据的正确访问和存储。手动调整对齐方式可以保证数据的正确性。

  4. 跨平台开发:内存对齐可以确保数据在不同平台上的一致性。这对于跨平台开发非常重要,因为不同的硬件架构可能有不同的对齐要求。

  5. 节省内存:内存对齐可以减少内存碎片,从而节省内存空间。当数据按照对齐要求存储时,不会出现因为填充字节而浪费内存的情况。

总之,C++ 内存对齐的主要意义在于提高访问效率、符合硬件要求、确保数据的正确性、支持跨平台开发以及节省内存空间。通过遵循对齐规则,可以充分利用硬件的性能优势,并确保程序在不同平台上的可移植性和正确性。

2.对齐原则


原则1 :数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在
offiset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身
长度中,比较小的那个进行。(先偏移到那个对齐标准数的指定倍数,在进行加上本身)
原则2:结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进
行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的
那个进行。
原则3 :结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元
素大小的整数倍地址开始存储。

3.默认对齐值

默认对齐值:
Linux默认#pragma pack(4)
window默认#pragma pack(8)
注:可以通过预编译命令#pragma pack(n) , n=1,2,4,8,16来改变这一系数,其中的n就是指定
的“对齐系数”。

例题1:

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(1)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量提升到2的 倍数6,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};int main()
{cout << sizeof(AA) << endl;system("pause");return 0;
}


#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(2)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};int main()
{// cout << sizeof(AA) << endl;cout << sizeof(BB) << endl;system("pause");return 0;
}

  

 

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(4)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;cout << sizeof(CC) << endl;system("pause");return 0;
}

 

8字节对齐

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};struct DD
{int a;   // 4<8  按4对齐, 偏移:0 位置 {0,3}char b;  // 1<8 按1对齐 偏移:4 位置:{4}short c; // 2<8 按照2 对齐 偏移 6  位置 {6,7}char d;  // 1<8  按照1 对齐 偏移为7 位置[8] 总大小为9
};int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;// cout << sizeof(CC) << endl;cout << sizeof(DD) << endl;system("pause");return 0;
}

#按照8位,有 包含 double的情况。

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
#include <stddef.h>
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};struct DD
{int a;   // 4<8  按4对齐, 偏移:0 位置 {0,3}char b;  // 1<8 按1对齐 偏移:4 位置:{4}short c; // 2<8 按照2 对齐 偏移 6  位置 {6,7}char d;  // 1<8  按照1 对齐 偏移为7 位置[8] 总大小为9
};struct EE
{int a;    // 4<8  按4对齐, 偏移:0 位置 {0,3}double b; // 8==8 按8对齐 偏移量偏移到8的倍数 偏移8 位置:{8,16}short c;  // 2<8 按照2 对齐 偏移 16  位置 {16,17}char d;   // 1<8  按照1 对齐 偏移为17 位置[18] 总大小为9
};int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;// cout << sizeof(CC) << endl;// cout << sizeof(DD) << endl;cout << sizeof(EE) << endl;cout << offsetof(EE, b) << endl; //查看偏移了多少内存。system("pause");return 0;
}

 例四:结构体包含结构体的运算。

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
#include <stddef.h>
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};struct DD
{int a;   // 4<8  按4对齐, 偏移:0 位置 {0,3}char b;  // 1<8 按1对齐 偏移:4 位置:{4}short c; // 2<8 按照2 对齐 偏移 6  位置 {6,7}char d;  // 1<8  按照1 对齐 偏移为7 位置[8] 总大小为9
};struct EE
{int a;    // 4<8  按4对齐, 偏移:0 位置 {0,3}double b; // 8==8 按8对齐 偏移量偏移到8的倍数 偏移8 位置:{8,16}short c;  // 2<8 按照2 对齐 偏移 16  位置 {16,17}char d;   // 1<8  按照1 对齐 偏移为17 位置[18] 总大小为9
};//=============================================================
struct GG
{//结构体内部最大元素为int.由于偏移量8刚好是4 的倍数,所以从8 开始存放struct 对应了规则三。int a1;   // 4<8   4  8   [8,11]char b1;  // 1<8  1  12  [12]short c1; // 2<8   2  14  [14,15]char d1;  // 1 <8   1  16  [16]
};
struct FF
{int a;   // 4<8 按4   偏移0 存放的位置【0,3】char b;  // 1<8 按1   偏移4           [4]short c; // 2<8  2      6            [6,7]GG g;//子strcut整体对齐系数=min((max(int,short,char),8))=4. 将内存补齐到4 的整数倍 20.char d; // 1<8  1   21  21//整体对齐系数 4 所有有21 补到24.
};
//===========================================
int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;// cout << sizeof(CC) << endl;// cout << sizeof(DD) << endl;// cout << sizeof(EE) << endl;// cout << offsetof(EE, b) << endl; //查看偏移了多少内存。cout << sizeof(FF) << endl;// cout << offsetof(FF, GG) << endl;system("pause");return 0;
}

 

 

 4.练习:

        

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
using namespace std;struct A
{int a; // [0,4]double b;// [ 8, 16 ]float c;// [ 17, 20 ]
};
// #24struct B
{char e[2]; // 1<8 按照2对齐  偏移 0  位置【0,1】short h;   // 2<8 2             2       [2,4]A a; // 24// 一共28 偏移一起达到32.
};int main()
{cout << sizeof(B) << endl;system("pause");return 0;
}

 

 

相关文章:

内存对齐--面试常问问题和笔试常考问题

1.内存对齐的意义 C 内存对齐的主要意义可以简练概括为以下几点&#xff1a; 提高访问效率&#xff1a;内存对齐可以使数据在内存中以更加紧凑的方式存储&#xff0c;从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据&#xff0c;而不需要额外的字节偏移计…...

贪心算法-会议室问题

1、题目描述 一些项目要占用一个会议室宣讲&#xff0c;会议室不能同时容纳两个项目。现在给你两个长度一样的数组&#xff0c;starts数组代码每个会议开始的时间&#xff0c;ends数组代表每个会议结束的时间。 在给你一个当前时间&#xff0c;请你求出当日可以利用会议室宣讲的…...

单日 5000 亿行 / 900G 数据接入,TDengine 3.0 在中国地震台网中心的大型应用

小T导读&#xff1a;为满足地震预警数据存储、检索和处理的建设与集成需求&#xff0c;以及响应国家国产软件自主可控的号召&#xff0c;中国地震台网中心决定选用国产数据库 TDengine 来存储和处理地震波形数据。本文将针对 TDengine 3.0 在地震领域的应用展开详细讲解。 关于…...

【VIM系列】cscope命令

cscope...

Vue的自定义事件(Custom Events):实现组件间通信的强大工具

Vue的自定义事件&#xff08;Custom Events&#xff09;&#xff1a;实现组件间通信的强大工具 Vue.js是一款流行的JavaScript框架&#xff0c;用于构建交互式的Web应用程序。在Vue中&#xff0c;组件是构建应用程序的基本单元&#xff0c;它们之间的通信对于构建复杂的应用非…...

简易实现通讯录(1.0)

前言 我们还是像以前一样,分为三个文件来书写,分别是contact.h,contact.c,test.c 分别用来声明函数,实现函数和测试函数功能,现在就让我们开始吧. 1.基本逻辑 首先我们定义通讯录里的数据,我们定义为结构体 typedef struct PeoInfo {char name[NAME_MAX];int age;char sex[SEX_…...

CSS笔记——触发式动画Transition、主动式动画Animation、Transfrom 动画、CSS 3D 动画、阴影和滤镜样式

CSS动画 一、触发式动画Transition transition过渡动画&#xff0c;一般配合伪类使用 属性值&#xff1a; transition-duration&#xff1a; 指定过渡效果的持续时间&#xff0c;以秒或毫秒为单位。 transition-timing-function&#xff1a; 指定过渡效果的时间函数&#xff…...

软件测试之Web安全测试详解

前言 随着互联网时代的蓬勃发展&#xff0c;基于Web环境下的应用系统、应用软件也得到了越来越广泛的使用。 目前&#xff0c;很多企业的业务发展都依赖于互联网&#xff0c;比如&#xff0c;网上银行、网络购物、网络游戏等。但&#xff0c;由于很多恶意攻击者想通过截获他人…...

MYSQL binlog

为了防止 binlog 文件过大导致无可用的磁盘空间&#xff0c;MySQL 提供了一个系统变量用来配置过期时间。 MySQL5.7 &#xff1a;expire_logs_days&#xff0c;精确度为天&#xff1b; MySQL8.0 &#xff1a;binlog_expire_logs_seconds&#xff0c;精确度为秒。 SET GLOBAL bi…...

Web 基础概念

自己总结的web前端知识体系大全 基础概念 DOM DOM是什么意思-前端入门_dom是什么意思啊_猿说前端的博客-CSDN博客 DOM的含义&#xff1a; DOM称为文件对象模型&#xff08;DocumentObjectModel&#xff0c;简称DOM&#xff09;&#xff0c;是W3C组织推荐的处理可扩展置标语言的…...

谈谈最近招人的感受!

最近折腾新的项目&#xff0c;面试了很多实习生小伙伴&#xff0c;我说说我的一些「面试」感受&#xff0c; 虽然是一个老生常谈的话题&#xff0c;但是依然提一下。 准时很重要&#xff1a;提前一点时间&#xff0c;踩个点&#xff0c;别迟到&#xff0c;面试的过程中由于每个…...

【日常业务开发】Java调用第三方http接口的常用方式

【日常业务开发】Java调用第三方http接口的常用方式 概述Java调用第三方http接口的方式通过JDK网络类Java.net.HttpURLConnection通过apache common封装好的HttpClient通过Apache封装好的CloseableHttpClient通过OkHttp通过Spring的RestTemplate通过hutool的HttpUtil 总结 概述…...

【大数据开发技术】实验04-HDFS文件创建与写入

文章目录 一、实验目标二、实验要求三、实验内容四、实验步骤 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS原理熟练掌握HDFS的API使用方法掌握单个本地文件写入到HDFS文件的方法掌握多个本地文件批量写入到HDFS文件的方法 二、实验要求 给出主要实验步骤成…...

中国制造让苹果跪服,将再增加一家中国高科技供应商

日前产业链人士指出由于京东方的OLED面板有力地制衡韩国面板厂商三星和LGD&#xff0c;促使他们降价&#xff0c;而且技术也不错&#xff0c;因此正计划再引入一家中国OLED面板厂商&#xff0c;以进一步促进OLED面板的竞争。 早期苹果的OLED面板完全由三星供应&#xff0c;由此…...

港卡开户感想(2023-8)

目录 银行列表预约开户总体原则外资行本地行内资行补充 选择落地点酒店及转换插头国际漫游换港币成行下一步 - 保险附录整理的银行资料 2023年8月份去了趟香港做银行开户, 整理如下供参考. 银行列表 https://www.hkma.gov.hk/gb_chi/smart-consumers/account-opening/contact-…...

机器学习第十一课--K-Means聚类

一.聚类的概念 K-Means算法是最经典的聚类算法&#xff0c;几乎所有的聚类分析场景&#xff0c;你都可以使用K-Means&#xff0c;而且在营销场景上&#xff0c;它就是"King"&#xff0c;所以不管从事数据分析师甚至是AI工程师&#xff0c;不知道K-Means是”不可原谅…...

Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的八月更新。在本次更新中&#xff0c;我们将推出新的以应用程序为中心的视图支持&#xff0c;帮助开发人员在一个项…...

论文笔记:ST2Vec: Spatio-Temporal Trajectory SimilarityLearning in Road Networks

2022 KDD 1 intro 现有的轨迹相似性学习方案强调空间相似性而忽视了时空轨迹的时间维度&#xff0c;这使得它们在有时间感知的场景中效率低下 如上图&#xff0c;在拼车过程中&#xff0c;T1表示司机计划的行程&#xff0c;T2和T3是两个想要搭车的人。T1和T2在空间上更接近&am…...

upload-labs靶场未知后缀名解析漏洞

upload-labs靶场未知后缀名解析漏洞 版本影响&#xff1a; phpstudy 版本&#xff1a;5.2.17 ​ 1 环境搭建 1.1 在线靶场下载&#xff0c;解压到phpstudy的www目录下&#xff0c;即可使用 https://github.com/c0ny1/upload-labs1.2 已启动&#xff1a;访问端口9000&…...

VisualStudio配置opencv

下载opencv 链接&#xff1a;https://opencv.org/releases/ 我下载的是4.7.0&#xff0c;选择windows下载。 下载成功后打开exe文件&#xff0c;选择路径安装。 配置环境变量 安装成功后找到安装目录&#xff0c;复制bin目录路径。 我的是放在了D盘 D:\Opencv4.7.0\opencv…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...