28得票2回答
使用“共同初始序列”来联合“拼接”结构体:为什么C语言(99+)要求有一个“可见的联合类型声明”,但C++不要求?

背景 针对使用 union 进行类型转换的方式大多数都未定义或实现有问题,讨论通常会引用以下代码段,例如通过 @ecatmur(https://dev59.com/pVwZ5IYBdhLWcg3wWvNY#31557852 )引用一种标准排列 struct 具有成员类型的“共同初始序列”的例...

28得票3回答
将T*与char*进行别名定义是允许的。反过来也允许吗?

注意:这个问题已经被重命名和简化,以使其更加聚焦和易读。 大多数评论都是针对旧文本的。 根据标准,不同类型的对象可能不能共享同一内存位置。因此,以下情况将是不合法的:std::array<short, 4> shorts; int* i = reinterpret_cast&...

25得票3回答
什么是类型转换,它的目的是什么?

类型转换 指两个指针指向同一内存位置,但将该位置表示为不同的类型。编译器会将这两个“玩笑”视为不相关的指针。类型转换可能会导致通过这两个指针访问的任何数据存在依赖性问题。 这篇文章想表达什么意思?如果我使用它或者不使用它会发生什么?

25得票5回答
如何在不产生未定义行为的情况下将一个浮点数数组重新用作双精度浮点数数组?

在一个特定的C++函数中,我恰好有一个指向一个大的浮点数缓冲区的指针,我想临时使用它来存储一半数量的双精度浮点数。有没有一种方法可以使用这个缓冲区作为存储双精度浮点数的临时空间,并且这种做法也符合标准(即不是未定义行为)? 总之,我希望实现以下目标: void f(float* buffe...

24得票1回答
在C99中,使用void*进行类型切换而不违反严格别名规则

我最近了解了严格别名规则,但我不太明白如何使用void *进行类型转换而不违反该规则。 我知道这样做会违反该规则:int x = 0xDEADBEEF; short *y = (short *)&x; *y = 42; int z = x; 我知道在 C99 中可以安全地使用联合...

23得票4回答
浮点数位和严格别名

我试图从浮点数中提取位,而不会引发未定义的行为。这是我的第一次尝试: unsigned foo(float x) { unsigned* u = (unsigned*)&x; return *u; } 据我理解,由于严格的别名规则,这并不保证能够正常工作,对吗?如...

23得票4回答
关于C++中的类型强制转换,有哪些看法?

我对C ++中指针/数组的类型转换约定很感兴趣。这是我目前所拥有的用例: 通过将二进制数据块视为32位整数数组(我们知道其总长度是4的倍数),然后对所有值进行求和并忽略溢出,计算一个简单的32位校验和。 我希望这样的函数应该长成这个样子:uint32_t compute_checksu...

21得票5回答
reinterpret_cast大多数情况下是无用的吗?

我已经阅读了关于使用 reinterpret_cast 的各种之前的问题,并且也阅读了相关的 C++ 标准措辞。本质上,问题在于指针转换操作的 reinterpret_cast 结果不能安全地用于除了强制转换回原始指针类型之外的任何其他目的。 然而,在实践中,大多数对 reinterpret...

20得票4回答
Strict aliasing和对齐问题

我需要一种安全的方式来在任意POD类型之间进行别名处理,该方式符合ISO-C++11明确考虑了n3242的第3.10/10和3.11条款或更高版本。这里有许多关于strict aliasing的问题,其中大部分涉及C而不是C ++。我找到了一个用联合体解决C问题的“解决方案”,可能使用了这个章...

19得票4回答
Strict aliasing和内存对齐

我有一些性能关键代码,其中有一个巨大的函数在函数开始时分配了大约40个不同大小的数组。这些数组大部分需要特定的对齐方式(因为这些数组在链条的其他位置被CPU指令访问时需要内存对齐,适用于英特尔和ARM CPU)。由于某些版本的gcc无法正确地对齐堆栈变量(特别是对于ARM代码),甚至有时它会说...