c++ - 将整数类型的数组作为另一个不相关的整数类型的数组访问的安全且符合标准的方法?
问题描述
这是我需要做的。我敢肯定,对于许多 C++ 开发人员来说,这是一项常规且可识别的编码任务:
void processAsUint16(const char* memory, size_t size) {
auto uint16_ptr = (const uint16_t*)memory;
for (size_t i = 0, n = size/sizeof(uint16_t); i < n; ++i) {
std::cout << uint16_ptr[i]; // Some processing of the other unrelated type
}
}
问题:我正在使用集成了 clang 静态代码分析的 IDE 进行开发,并且我尝试的所有转换方式memcpy
(我不想诉诸)要么不鼓励要么强烈不鼓励。例如,reinterpret_cast
被CPP 核心指南简单禁止。不鼓励 C 风格的演员表。static_cast
不能在这里使用。
避免类型别名问题和其他类型的未定义行为的正确方法是什么?
解决方案
避免类型别名问题和其他类型的未定义行为的正确方法是什么?
您使用memcpy
:
void processAsUint16(const char* memory, size_t size) {
for (size_t i = 0; i < size; i += sizeof(uint16_t)) {
uint16_t x;
memcpy(&x, memory + i, sizeof(x));
// do something with x
}
}
uint16_t
是微不足道的可复制的,所以这很好。
或者,在 C++20 中,使用std::bit_cast
(尴尬地必须先通过一个数组):
void processAsUint16(const char* memory, size_t size) {
for (size_t i = 0; i < size; i += sizeof(uint16_t)) {
alignas(uint16_t) char buf[sizeof(uint16_t)];
memcpy(buf, memory + i, sizeof(buf));
auto x = std::bit_cast<uint16_t>(buf);
// do something with x
}
}
实际上,如果您只是 ,编译器只会“做正确的事情” reinterpret_cast
,即使它是未定义的行为。也许类似的东西std::bless
会给我们一个更直接的、非复制的、这样做的机制,但在那之前......
推荐阅读
- spring-mvc - 无法提取响应:没有找到适合响应类型 [boolean] 和内容类型 [text/html;charset=iso-8859-1] 的 HttpMessageConverter
- javascript - 如何在没有 JavaScript 的情况下获取浏览器时区
- php - I want to make my long reference link dynamic with htaccess
- html - CSS如何对齐不同卡片表上的内容,例如
- javascript - vue中的简单验证
- javascript - JS递归代码抛出最大调用堆栈大小错误
- css - 让 SVG 加号出现在选项卡的右侧,而不是包含 div 的右侧
- java - Jackson 泛型类型的反序列化 - 尝试解析的子类型时缺少类型
- android - 应用程序手动关闭时未触发 AlarmManager
- javascript - '{ identifier: string; 类型的参数 }' 不可分配给“ConcatArray”类型的参数
'