type-punning相关内容
std::bit_cast显然是在c++20中引入的。而std::start_lifetime_as是在c++23中建议的(来自P0593R5)。由于它们似乎都要求所涉及的数据类型无论如何都是微不足道的,那么一旦引入后者,还需要前者吗? 对于没有提供有关这些新功能的更多信息,提前表示歉意。我是在看了cppcon 2019关于打字双关语的讲座后才听说他们的,而且我在Google上找不到太多关于
..
此代码将auint64_t读取为Twouint32_t是由于严格的别名规则: uint64_t v; uint32_t lower = reinterpret_cast(&v)[0]; uint32_t upper = reinterpret_cast(&v)[1]; 同样,写入uint64_t的上半部分和下半部分的代码是UB的,原因相同:
..
堆栈溢出问题的一些答案获取IEEE Single-precision bits for a float 建议使用 union 结构进行类型双关(例如:将 float 的位转换为 uint32_t): 联合{浮动 f;uint32_t你;}联合国;un.f = your_float;uint32_t 目标 = un.u; 但是,根据 C99 标准(至少是草案 n1124),联合的 uint32_
..
我之前很舒服地使用了工会;今天,当我阅读 这篇文章并得知这段代码时,我感到很震惊 联合 ARGB{uint32_t 颜色;结构组件标签{uint8_t b;uint8_t g;uint8_t r;uint8_t一个;} 组件;} 像素;像素.color = 0xff040201;//ARGB::color 从现在开始是活跃的成员//在某处,没有对像素进行任何编辑if(pixel.componen
..
我已经搜索了一段时间,但找不到明确的答案. 很多人说使用联合来键入双关是未定义且不好的做法.为什么是这样?考虑到您将原始信息写入的内存不会自行更改(除非它超出堆栈范围,但这不是联合问题),我看不出它会做任何未定义的事情的任何原因,那将是糟糕的设计). 人们引用严格的别名规则,但在我看来,这就像说你不能这样做,因为你不能这样做. 如果不输入双关语,联合还有什么意义?我在某处看到它们
..
有没有一种在 C 和 C++ 中都有效的类型双关语?最好是低开销,并避免琐碎的预处理器黑客攻击. 在 C89 中,我知道我可以这样做: unsigned int float_bits(float num) {return *(unsigned int *)#} 但是这违反了 C99 的严格别名规则.所以像这样的东西可能在各种 C 标准中更便携: unsigned int flo
..
双关语 指针别名的一种形式,其中两个指针指向内存中的同一位置,但将该位置表示为不同的类型.编译器将同时处理这两个“双关语".作为不相关的指针.对于通过两个指针访问的任何数据,类型双关语都有可能导致依赖性问题. 这篇文章想表达什么?如果我使用或不使用会怎样? 解决方案 正如它所说,类型双关是当你有两个不同类型的指针时,都指向同一个位置.示例: //错误代码uint32_t 数据
..
我试图在不调用未定义行为的情况下从浮点数中提取位.这是我的第一次尝试: 无符号 foo(float x){无符号* u = (无符号*)&x;返回 *u;} 据我了解,由于严格的别名规则,这不能保证有效,对吧?如果使用字符指针进行中间步骤,它是否有效? 无符号条形(float x){char* c = (char*)&x;无符号* u = (无符号*)c;返回 *u;} 还是我必须自己提取
..
我对 C++ 中类型双关指针/数组的约定很好奇.这是我目前的用例: 通过将二进制数据块视为 32 位整数数组(我们知道其总长度是 4 的倍数),然后对所有值求和并忽略溢出,计算一个简单的 32 位校验和. 我希望这样的函数看起来像这样: uint32_t compute_checksum(const char *data, size_t size){const uint32_t *udata
..
背景 关于通过 union 的类型双关的大多数非或实现定义的性质的讨论通常引用以下位,这里通过 @ecatmur ( https://stackoverflow.com/a/31557852/2757035 ),关于标准布局 struct 的豁免具有“共同初始成员类型的序列": C11(6.5.2.3 结构和联合成员;语义): [...] 如果联合包含多个共享公共初始序列的结构(
..
Stack Overflow 问题的一些答案 获取IEEE Single-precision bits for a float 建议使用 union 结构进行类型双关(例如:将 float 的位转换为 uint32_t): union {浮动 f;uint32_t u;} 联合国;un.f = your_float;uint32_t 目标 = un.u; 但是,根据 C99 标准(至少草案 n
..
我以前很舒服地使用过工会;今天,当我阅读这篇文章时,我感到震惊并知道这段代码 联合 ARGB{uint32_t 颜色;结构组件标签{uint8_t b;uint8_t g;uint8_t r;uint8_t a;} 成分;} 像素;像素.颜色 = 0xff040201;//ARGB::colour 从现在开始是活跃成员//线下某处,没有对像素进行任何编辑if(pixel.components.a
..
我一直在寻找,但找不到明确的答案. 很多人说使用联合来输入双关语是未定义和不好的做法.为什么是这样?考虑到您写入原始信息的内存不会自行更改(除非它超出堆栈的范围,但这不是联合问题,我看不出有任何理由为什么它会做任何未定义的事情),那将是糟糕的设计). 人们引用严格的别名规则,但在我看来,这就像说你不能做因为你不能做. 如果不输入双关语,联合还有什么意义?我在某处看到它们应该用于在
..
6.5(p7) 有一个关于 unions 和 aggregates 的项目符号: 一个对象的存储值只能由左值访问具有以下类型之一的表达式: [...] ——一个聚合或联合类型,包括上述之一其成员之间的类型(包括递归地,子聚合或包含联合),或 这不是很清楚它的意思.是否需要至少一个成员或所有成员来满足严格的别名规则.特别是关于 unions: 联合别名{无符号字符 uint
..
似乎有两种类型的C ++.实用的C ++和语言律师C ++.在某些情况下,将一种类型的位模式解释为另一种类型可能很有用.浮点技巧是一个明显的例子.让我们以著名的快速逆平方根为基础(取自 Wikipedia ,该取自 Wikipedia ).href ="https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_ma
..
说我的程序中有一个非常关键的性能循环,需要检查点是否在矩形内,但是我知道在编译时下界始终为0,如下所示:(x> = 0& y> = 0&& x()或 union 类似)来消除前两个比较C ++),因为符号位可以保证任何负数都会变成一个 unsigned int ,其大小足以使边界检查失
..
想象一下: uint64_t x = *(uint64_t *)((unsigned char [8]){'a','b','c','d','e','f','g', 'H'}); 我有阅读,这些类型的双关语是未定义的行为.为什么?我实际上是将8个字节的字节重新解释为8个字节的整数.我看不到与 union 的区别,除了类型pun是未定义的行为而 union 的不是?我亲自问了一位程序员,他们说
..
punning类型 指针别名的一种形式,其中两个指针指向内存中的相同位置,但表示该位置为不同类型。编译器将同时处理两个“双关”。作为不相关的指针。 punning类型可能会对通过两个指针访问的任何数据造成依赖关系问题。 文章试图说什么? $ b正如上面所说,$ b 解决方案 类型punning是指当您有两个不同类型的指针,它们都指向同一位置时。示例: //错误代码 uin
..
我正在通过接口(蓝牙,列表)获取4个字节的数据.数据表示IEEE 754浮点数(例如0x3fd0a3d7,大约表示1.63作为二进制32 float) 在dart lang中是否有一种方法可以将其转换/键入双精度浮点数然后加倍? Java中的intBitsToFloat之类的东西.找不到任何东西.还是我只需要自己编写IEEE 754解析文件? 解决方案 这有效,只需导入dart:ty
..
我有一个以bool作为模板参数Dyanmic的模板类.无论参数是true还是false,它都具有完全相同的数据成员.它们只是成员功能不同. 在一种情况下,我需要暂时将其转换为另一种,而不是使用复制/移动构造函数.所以我求助于打字.为了确保它引起问题,我使用了两个static_asserts: d_true=Dynamic(...); ... static_assert(si
..