type-punning

    5热度

    1回答

    我正在构建一个动态动画&渲染系统,我想用Boost.Units来表示物理量来获得很好的尺寸安全性。然而,我将不得不将数组的数量传递给对Boost一无所知的函数,例如: OpenGL缓冲区填充命令。这些简单地取const void *,并期望在解引用它时找到一个float或double值的数组。他们读取数据。 来自BLAS和LAPACK的不同实现的线性代数函数(例如gemm或gesv)。这些通常将f

    2热度

    2回答

    由于读了很多警告不要使用工会这样的: union rgba { struct { uint8_t r, g, b, a; } components; uint8_t index[4]; uint32_t value; }; ,因为这是不确定的行为,我决定让事情变得简单,像这样: struct rgba { uint8

    -2热度

    1回答

    考虑以下两个方案: #include <stdio.h> int main() { int z = 6.4; printf("%d %d", z, 6.4); return 0; } 输出为6 -1717986918。 #include <stdio.h> int main() { int z = 6.4; printf("%d

    2热度

    2回答

    假设我有一个基地structFOO基本上是一个C风格struct: struct FOO { double bar1; int bar2; }; 和C++式struct(其具有成员函数,没有构件数据,但没有v表): struct bar : public FOO { double getBar1() const; int getBar2() con

    3热度

    2回答

    ,不知是否安全根据C99的标准,来解释这样一个结构: struct my_struct_t { int a; int b; int c; }; 作为int[3]。即这个代码片段是否适合所有ABI? struct my_struct_t f; int *i = &f.a; i[0] = 1; // f.a == 1 i[1] = 2; // f.b == 2

    2热度

    2回答

    我们都知道这样 union U {float a; int b;}; U u; std::memset(u, 0, sizeof u); u.a = 1.0f; std::cout << u.b; 这种类型的双关在C未定义行为++。 它是未定义的,因为在u.a = 1.0f;赋值之后.a变为活动字段并且.b变为非活动字段,并且它是未定义行为以从非活动字段中读取。我们都知道这一点。 现

    3热度

    1回答

    是相同类型的类型双胞胎数组,但大小不同仍然违反了严格的别名? int arr[4]; int(&ref)[2] = reinterpret_cast<int(&)[2]>(arr); arr[0] = 0; //write to original ref[0]; //read from pun

    1热度

    1回答

    假设我有一个类A: class A : virtual SomeOtherClass{ //Stuff here }; 假设我有这样做的地方: A thing; alignas(A) uint8_t arr[sizeof(A)]; for (int x = 0; x < sizeof(A); x++) { //Copy into array arr[x]

    0热度

    1回答

    我想将签名的int32存储为一个未签名的uint32,这样我可以稍后从中提取int32。当它存储像这样的整数时,不会使用uint32本身的值,但不幸的是我不能在这种情况下使用联合。我目前做的方式是通过简单地将其转换: int32 signedVar = -500; uint32 unsignedVar = uint32(signedVar); func(int32(unsignedVar));

    4热度

    3回答

    #include <stdio.h> union p{ int x; float y; }; int main() { union p p; p.x = 10; printf("%f\n", p.y); return 0; } 输出: 0.000000 当我尝试编译上面的程序,它没有显示任何警告, 即使在主功能。为什么p