type-punning相关内容

STD::BIT_CAST和STD::START_LIFEST_AS之间有什么有用的区别吗?

std::bit_cast显然是在c++20中引入的。而std::start_lifetime_as是在c++23中建议的(来自P0593R5)。由于它们似乎都要求所涉及的数据类型无论如何都是微不足道的,那么一旦引入后者,还需要前者吗? 对于没有提供有关这些新功能的更多信息,提前表示歉意。我是在看了cppcon 2019关于打字双关语的讲座后才听说他们的,而且我在Google上找不到太多关于 ..
发布时间:2022-05-17 09:15:03 C/C++开发

C 和 C++ 中联合的用途

我之前很舒服地使用了工会;今天,当我阅读 这篇文章并得知这段代码时,我感到很震惊 联合 ARGB{uint32_t 颜色;结构组件标签{uint8_t b;uint8_t g;uint8_t r;uint8_t一个;} 组件;} 像素;像素.color = 0xff040201;//ARGB::color 从现在开始是活跃的成员//在某处,没有对像素进行任何编辑if(pixel.componen ..
发布时间:2022-01-30 16:42:07 C/C++开发

工会和类型双关语

我已经搜索了一段时间,但找不到明确的答案. 很多人说使用联合来键入双关是未定义且不好的做法.为什么是这样?考虑到您将原始信息写入的内存不会自行更改(除非它超出堆栈范围,但这不是联合问题),我看不出它会做任何未定义的事情的任何原因,那将是糟糕的设计). 人们引用严格的别名规则,但在我看来,这就像说你不能这样做,因为你不能这样做. 如果不输入双关语,联合还有什么意义?我在某处看到它们 ..
发布时间:2022-01-30 16:19:46 C/C++开发

跨 C 和 C++ 标准的可靠类型双关语

有没有一种在 C 和 C++ 中都有效的类型双关语?最好是低开销,并避免琐碎的预处理器黑客攻击. 在 C89 中,我知道我可以这样做: unsigned int float_bits(float num) {return *(unsigned int *)#} 但是这违反了 C99 的严格别名规则.所以像这样的东西可能在各种 C 标准中更便携: unsigned int flo ..
发布时间:2022-01-13 08:16:38 C/C++开发

什么是类型双关语,它的目的是什么?

双关语 指针别名的一种形式,其中两个指针指向内存中的同一位置,但将该位置表示为不同的类型.编译器将同时处理这两个“双关语".作为不相关的指针.对于通过两个指针访问的任何数据,类型双关语都有可能导致依赖性问题. 这篇文章想表达什么?如果我使用或不使用会怎样? 解决方案 正如它所说,类型双关是当你有两个不同类型的指针时,都指向同一个位置.示例: //错误代码uint32_t 数据 ..
发布时间:2022-01-13 08:14:28 C/C++开发

浮点位和严格的别名

我试图在不调用未定义行为的情况下从浮点数中提取位.这是我的第一次尝试: 无符号 foo(float x){无符号* u = (无符号*)&x;返回 *u;} 据我了解,由于严格的别名规则,这不能保证有效,对吧?如果使用字符指针进行中间步骤,它是否有效? 无符号条形(float x){char* c = (char*)&x;无符号* u = (无符号*)c;返回 *u;} 还是我必须自己提取 ..
发布时间:2022-01-09 10:40:51 C/C++开发

关于 C++ 中类型双关的观点?

我对 C++ 中类型双关指针/数组的约定很好奇.这是我目前的用例: 通过将二进制数据块视为 32 位整数数组(我们知道其总长度是 4 的倍数),然后对所有值求和并忽略溢出,计算一个简单的 32 位校验和. 我希望这样的函数看起来像这样: uint32_t compute_checksum(const char *data, size_t size){const uint32_t *udata ..
发布时间:2021-12-31 21:49:40 C/C++开发

带有“通用初始序列"的联合“双关语"结构:为什么 C(99+)而不是 C++ 规定了“联合类型的可见声明"?

背景 关于通过 union 的类型双关的大多数非或实现定义的性质的讨论通常引用以下位,这里通过 @ecatmur ( https://stackoverflow.com/a/31557852/2757035 ),关于标准布局 struct 的豁免具有“共同初始成员类型的序列": C11(6.5.2.3 结构和联合成员;语义): [...] 如果联合包含多个共享公共初始序列的结构( ..
发布时间:2021-12-23 16:58:24 C/C++开发

C 和 C++ 中联合的目的

我以前很舒服地使用过工会;今天,当我阅读这篇文章时,我感到震惊并知道这段代码 联合 ARGB{uint32_t 颜色;结构组件标签{uint8_t b;uint8_t g;uint8_t r;uint8_t a;} 成分;} 像素;像素.颜色 = 0xff040201;//ARGB::colour 从现在开始是活跃成员//线下某处,没有对像素进行任何编辑if(pixel.components.a ..
发布时间:2021-12-01 15:36:24 C/C++开发

联合和类型双关

我一直在寻找,但找不到明确的答案. 很多人说使用联合来输入双关语是未定义和不好的做法.为什么是这样?考虑到您写入原始信息的内存不会自行更改(除非它超出堆栈的范围,但这不是联合问题,我看不出有任何理由为什么它会做任何未定义的事情),那将是糟糕的设计). 人们引用严格的别名规则,但在我看来,这就像说你不能做因为你不能做. 如果不输入双关语,联合还有什么意义?我在某处看到它们应该用于在 ..
发布时间:2021-12-01 15:14:48 C/C++开发

通过工会别名

6.5(p7) 有一个关于 unions 和 aggregates 的项目符号: 一个对象的存储值只能由左值访问具有以下类型之一的表达式: [...] ——一个聚合或联合类型,包括上述之一其成员之间的类型(包括递归地,子聚合或包含联合),或 这不是很清楚它的意思.是否需要至少一个成员或所有成员来满足严格的别名规则.特别是关于 unions: 联合别名{无符号字符 uint ..
发布时间:2021-09-14 18:34:25 其他开发

在C ++中进行类型修饰的现代正确方法是什么?

似乎有两种类型的C ++.实用的C ++和语言律师C ++.在某些情况下,将一种类型的位模式解释为另一种类型可能很有用.浮点技巧是一个明显的例子.让我们以著名的快速逆平方根为基础(取自 Wikipedia ,该取自 Wikipedia ).href ="https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_ma ..
发布时间:2021-05-28 20:14:48 C/C++开发

通过消除对> =比较的需要,将punning带符号的无符号整数类型可以使边界检查更快吗?

说我的程序中有一个非常关键的性能循环,需要检查点是否在矩形内,但是我知道在编译时下界始终为0,如下所示:(x> = 0& y> = 0&& x()或 union 类似)来消除前两个比较C ++),因为符号位可以保证任何负数都会变成一个 unsigned int ,其大小足以使边界检查失 ..
发布时间:2021-05-16 19:12:45 C/C++开发

为什么将Punning类型视为UB?

想象一下: uint64_t x = *(uint64_t *)((unsigned char [8]){'a','b','c','d','e','f','g', 'H'}); 我有阅读,这些类型的双关语是未定义的行为.为什么?我实际上是将8个字节的字节重新解释为8个字节的整数.我看不到与 union 的区别,除了类型pun是未定义的行为而 union 的不是?我亲自问了一位程序员,他们说 ..
发布时间:2021-04-21 19:43:56 其他开发

什么是punning&它的目的是什么?如果我不使用它会发生什么?

punning类型 指针别名的一种形式,其中两个指针指向内存中的相同位置,但表示该位置为不同类型。编译器将同时处理两个“双关”。作为不相关的指针。 punning类型可能会对通过两个指针访问的任何数据造成依赖关系问题。 文章试图说什么? $ b正如上面所说,$ b 解决方案 类型punning是指当您有两个不同类型的指针,它们都指向同一位置时。示例: //错误代码 uin ..
发布时间:2020-09-29 22:33:38 C/C++开发

在dart中浮动IEEE 754时解析整数位模式

我正在通过接口(蓝牙,列表)获取4个字节的数据.数据表示IEEE 754浮点数(例如0x3fd0a3d7,大约表示1.63作为二进制32 float) 在dart lang中是否有一种方法可以将其转换/键入双精度浮点数然后加倍? Java中的intBitsToFloat之类的东西.找不到任何东西.还是我只需要自己编写IEEE 754解析文件? 解决方案 这有效,只需导入dart:ty ..
发布时间:2020-07-12 05:19:51 其他开发

C ++中的类型调整问题

我有一个以bool作为模板参数Dyanmic的模板类.无论参数是true还是false,它都具有完全相同的数据成员.它们只是成员功能不同. 在一种情况下,我需要暂时将其转换为另一种,而不是使用复制/移动构造函数.所以我求助于打字.为了确保它引起问题,我使用了两个static_asserts: d_true=Dynamic(...); ... static_assert(si ..
发布时间:2020-07-12 05:19:48 C/C++开发