9得票5回答
以符合标准的方式将具有相同类型成员的结构重新解释为数组

在各种 3D 数学代码库中,我有时会遇到这样的内容: struct vec { float x, y, z; float& operator[](std::size_t i) { assert(i < 3); retur...

8得票4回答
高效的类型转换而不会出现未定义的行为。

假设我正在开发一个名为libModern的库。该库使用一个旧的C语言库作为实现策略,称为libLegacy。libLegacy的接口如下: typedef uint32_t LegacyFlags; struct LegacyFoo { uint32_t x; uint32...

8得票1回答
严格别名规则和std :: array与C风格数组的比较

当使用gcc 4.7(在OS X上使用MacPorts构建的g ++ -mp-4.7(GCC)4.7.0)编译以下代码时,我得到了看似矛盾的结果。 当我尝试将std :: array的一部分重新解释和解引用为uint32_t时,编译器不会发出警告,但是使用C样式数组时会发出警告。 示例代码: ...

8得票3回答
在不违反严格别名规则的情况下,使用C++中的共享内存缓冲区

我正在尝试实现一个共享内存缓冲区,但不想违反C99的严格别名规则。 假设我有一些处理数据的代码,并需要一些“临时”内存来操作。我可以像这样编写它: void foo(... some arguments here ...) { int* scratchMem = new int[1000...

8得票4回答
C/C++严格别名、对象生命周期以及现代编译器

我是一个有用的助手,可以为您翻译文本。 我面临C++严格别名规则及其可能影响的困惑。考虑以下代码: int main() { int32_t a = 5; float* f = (float*)(&a); *f = 1.0f; int32_t b = a; /...

8得票2回答
C++严格别名问题:当不使用由放置new返回的指针时

这可能导致未定义的行为吗? uint8_t storage[4]; // We assume storage is properly aligned here. int32_t* intPtr = new((void*)storage) int32_t(4); // I know thi...

8得票5回答
严格的指针别名:对于一个特定问题有任何解决方案吗?

我遇到了一个由于违反严格指针别名规则而引起的问题。我有一个类型T,它来自模板和一些与sizeof相同大小的整数类型Int。我的代码实际上执行以下操作: T x = some_other_t; if (*reinterpret_cast <Int*> (&x) == 0) ...

8得票2回答
严格指针别名:通过“volatile”指针/引用访问是否是一种解决方案?

在看完一个特定问题的自问自答和评论后,我想了解这是否是一个适当的解决方案、变通方法/技巧或者只是错误的。 具体地,我重写了代码: T x = ...; if (*reinterpret_cast <int*> (&x) == 0) ... 作为: T x = ...

7得票6回答
如何在嵌入式系统中安全地执行类型转换

我们的团队正在将一些旧架构的移植代码,改为基于ARM Cortex M3平台的新产品,并使用定制版的GCC 4.5.1。我们正在从通信链接读取数据,并尝试将原始字节数组转换为结构体以清晰地解析数据。但是,在将指针转换为结构体并进行解引用后,我们收到了一个警告:“dereferencing ty...

7得票5回答
在C++20中,将uint64_t类型解释为两个uint32_t类型的技巧。

由于严格的别名规则,这段代码将uint64_t读取为两个uint32_t是未定义行为: uint64_t v; uint32_t lower = reinterpret_cast<uint32_t*>(&v)[0]; uint32_t upper = reinterpre...