19得票3回答
你可以使用std::bit_cast将一个std::array转换为一个对象的字节吗?

在他最近的演讲中,Timur Doumler提到,std::bit_cast不能用于将float位转换为unsigned char[4],因为C风格数组不能从函数返回。我们应该使用std::memcpy或者等到C++23(或更晚)时,类似reinterpret_cast(&f)[i]的语法将变...

16得票5回答
使用联合体的不同元素指针作为函数参数调用函数是否属于未定义行为?

在使用-O1和-O2编译时(无论是gcc还是clang),此代码打印出不同的值:#include <stdio.h> static void check (int *h, long *k) { *h = 5; *k = 6; printf("%d\n", *h); }...

15得票3回答
你能通过一个类型为T的结构体来给T的数组取别名吗?就像std::complex<T>[N]可以通过T[N * 2]来取别名一样。

自从C++11以来,保证std::complex&lt;T&gt;[n]可以作为T[n*2]进行别名处理,并具有明确定义的值。这正是人们对于任何主流架构的期望。 对于我自己的类型,比如struct vec3 { float x, y, z; },是否可以通过标准C++实现这种保证,还是只能依...

14得票2回答
使用C++11在编译时以程序方式查找字节序

我在Stack Overflow上参考了许多关于这个主题的问题,但到目前为止都没有找到任何解决方案。这里提到了一个自然的解决方案:在编译时确定字节序。 但是,在评论中提到了相关的问题和相同的答案。 经过一些修改,我能够使用g++和clang++ (-std=c++11)编译出类似的解决方案,...

14得票5回答
可移植数据重新解释

我想以一种可移植的方式(C99)将一种类型的数据重新解释为另一种类型。我并不是在谈论强制转换,而是想要对给定的数据进行重新解释。此外,通过“可移植”,我指的是它不违反C99规则 - 我并不是说重新解释的值在所有系统上都相等。 我知道3种不同的重新解释数据的方法,但其中只有两种是可移植的: ...

13得票2回答
在C语言中的类型别名和联合体

目前我正在开发一个小型编译器的项目,只是出于兴趣。 我决定采用构建极其简单的虚拟机的方法进行开发,这样我就不必担心学习elf、intel汇编等方面的知识了。 我的问题是关于在C语言中使用联合体进行类型转换。我决定只支持32位整数和32位浮点数值存储在虚拟机的内存中。为此,虚拟机的“主内存”...

12得票7回答
你能将一个双精度数组重新解释为包含双精度的结构体吗?

可以将一个双重数组转换为由双精度数构成的结构体吗? struct A { double x; double y; double z; }; int main (int argc , char ** argv) { double arr[3] = {1.0,2.0,3...

12得票2回答
将有符号整数转换为无符号整数是否可以通过消除>=比较来加快边界检查的速度?

假设我在程序中有一个非常性能关键的循环,在其中需要检查一个点是否在矩形内,但我知道在编译时边界始终为0,如下所示:(x &gt;= 0 &amp;&amp; y &gt;= 0 &amp;&amp; x &lt; width &amp;&amp; y &lt; height) 我可以通过将x...

11得票9回答
将一个具有较少元素的C结构转换为另一个结构,这样做是否安全?

我正在尝试在C语言中进行面向对象编程(只是为了好玩),并想出了一种通过使用一个带有公共部分的结构体和一个更大的结构体来进行数据抽象的方法,其中公共部分排在私有部分之前。这样,在构造函数中创建整个结构体,并将其转换为小的结构体后返回。这个方法正确吗?还是可能会出错? 以下是一个例子:#incl...