c++ - std::optional 成员是否连续存储?
问题描述
我想我对如何存储可选值感到有些困惑。在构造包含std::optional<T>
成员的类或结构时,这些成员是连续存储在内存中还是可选动态分配?例如,下面的结构会是一个连续的内存块吗?
struct Material
{
std::string name;
std::optional<size_t> albedo;
std::optional<size_t> normal;
std::optional<size_t> metalness;
std::optional<size_t> roughness;
std::optional<size_t> ao; // ambient occlusion
bool hasAlphaChannel = false;
};
解决方案
optional
要求不使用动态分配。
如果一个可选项包含一个值,则保证该值作为可选对象占用空间的一部分进行分配,即不会发生动态内存分配。因此,可选对象建模对象,而不是指针,即使定义了 operator*() 和 operator->()。
https://en.cppreference.com/w/cpp/utility/optional
还有optional
可能发生的成员变量和填充。所以不,它们不一定是连续的,但它们在您声明它们的对象内。
推荐阅读
- python - 如何修复递归函数的逻辑流程
- gitlab - Gitlab CI 无法连接到服务
- linux - 当您使用“npm install -g”安装节点模块时,npm 将全局安装的文件放在哪里?
- firebase - 使用 Firebase Authentication 服务时,如何使用同一个邮箱地址登录同一个项目的不同应用?
- macos - OSX - 如何从另一个进程读取应用程序的徽章?
- python-3.x - 不知道为什么我会收到“TypeError:无法将'int'对象隐式转换为str”错误
- android - 在以下类型的对象上找不到参数 [com.android.tools.build:gradle:3.3.0] 的方法 classpath():
- sql-server - 不输入 SQL if 语句
- kubernetes - Kubernetes (K8s) - 在一段时间内未创建新容器时从 Prometheus/Grafana 获取警报
- c# - 如何从表行而不是数据库中的列中获取最大值和最小值