- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类,其目的是将可能具有对齐限制的数据移入或移出数据未对齐的序列化内存缓冲区。我已按如下方式设置和获取处理程序:
#include <cstring>
template<typename T>
struct handle_type {
static inline T get(const void *data) {
T value;
memcpy(&value, data, sizeof(T));
return value;
}
static inline void set(void *data, T value) {
memcpy(data, &value, sizeof(T));
}
};
c++20出来后,我希望它能变成这样:
#include <bit>
template<typename T>
struct handle_type {
union unaligned { char bytes[sizeof(T)]; }; // EDIT: changed from struct
static inline T get(const void *data) {
return std::bit_cast<T>(*(const unaligned*)data);
}
static inline void set(void *data, T value) {
*(unaligned *)data = std::bit_cast<unaligned>(value);
}
};
它会起作用吗?还是我使用的是 inerim 类型(未对齐的结构类型)容易造成问题?
最佳答案
你的 get
函数是 UB,除非用户提供了一个指向 unaligned
对象的指针。您的 set
函数类似于 UB,除非 data
是一个 unaligned
对象。这两种情况都违反了严格的别名。请记住:严格的别名后门是关于一个实际的 char*
;这与恰好包含 char*
的对象不同。
此外,set
可能是一个编译错误,完全取决于 unaligned
的实现是否与 T< 具有相同的大小
。毕竟,unaligned
可能在末尾有填充。
bit_cast
想要主要处理对象,而不是内存的随机缓冲区。为此,您应该坚持使用 memcpy
。
<changed to use
union
instead ofstruct
>
那什么都没有改变;使用 union
并不能保证 union
的大小等于其最大数据成员的大小。来自 [class.union]/2:
The size of a union is sufficient to contain the largest of its non-static data members.
强调:“足够”,而不是“等于”。该标准允许实现使 union 大于其最大数据成员的能力,因为这样的大小仍然“足够”。
关于c++ - 除了 memcpy 之外,bit_cast 还会有什么额外的 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58985965/
以下是引用自[bit.cast]下的标准(草案n4861)(强调的是我的) Returns: An object of type To. Implicitly creates objects nest
根据 ISO C++ 委员会的最后一次 session ,bit-cast将在 C++20 标准中引入。 我知道 reinterpret_cast 不适合这份工作,因为 type aliasing r
在他最近的演讲中“Type punning in modern C++”帖木儿·杜姆勒 said那std::bit_cast不能用于位转换 float进入unsigned char[4]因为 C 风格
std::bit_cast显然是在 c++20 中引入的。和 std::start_lifetime_as建议用于 c++23(来自 P0593R5)。由于它们似乎都要求所涉及的数据类型无论如何都是微
我听说std::bit_cast将在 C++20 中实现,我对实现它必然需要特殊编译器支持的结论感到有点困惑。 公平地说,我听到的论点是该实现执行 memcpy 操作,而 memcpy 通常不是 co
我有一个类,其目的是将可能具有对齐限制的数据移入或移出数据未对齐的序列化内存缓冲区。我已按如下方式设置和获取处理程序: #include template struct handle_type {
我想知道在 c++2a 模式下是否有可用的 constexpr std::bit_cast 或等价物用于 g++-trunk。我需要这个来进行编译时检查。 最佳答案 根据 cppreference ,
A previous question已询问如何在 C++11 中的整数类型和 GLvoid* 之间进行转换(基于该问题的标签),但在这里我对 C++20 感兴趣。 现在有 std::bit_cast
一位同事向我展示了一个 C++20 程序,其中使用 std::bit_cast 虚拟创建了一个闭包对象。从它捕获的值(value)来看: #include #include class A {
再次,关于 C++ 和有符号 -> 无符号(相同大小)转换/转换。 C++ 标准 4.7/2 规定: If the destination type is unsigned, the resultin
我是一名优秀的程序员,十分优秀!