草庐IT

c++ - 如何在 C++ 中从 void* 数组中有效地解压 float、int16、int32 等数据?

我有一组PCM数据;它可以是16位、24位打包、32位等。它可以是有符号的,也可以是无符号的,可以是32位或64位float。它当前存储为void**矩阵,首先按channel索引,然后按帧索引。目标是让我的库接受任何PCM格式并对其进行缓冲,而无需对数据进行操作以适应指定的结构。如果A/D转换器吐出交错PCM的24位打包数组,我需要优雅地接受它。我还需要支持16位非交错,以及上述格式的任何排列。我知道运行时的位深度和其他信息,并且我正在尝试高效编码而不重复代码。我需要的是一种有效的方法来转换矩阵,将PCM数据放入矩阵,然后再将其拉出。我可以将矩阵转换为int32_t或int16_t分

c++ - 为什么 C++11 不支持 'std::function<void(int, ...)>' ?

#includevoidf1(int){}voidf2(int,...){}intmain(){std::functiong1=f1;//OK.std::functiong2=f2;//Error!NotstandardC++!}为什么C++11不提供专门的模板类如下:templateclassfunction{//.........}; 最佳答案 我并不是要提供未提供该特化的最终原因(我不知道),但也许我可以暗示在尝试实现它时可能遇到的一些技术障碍。这有望让您了解为什么不存在特化。让我们首先考虑std::function类模板本身

c++ - 使用带有 int 作为字符类型的 iostreams 可以吗?

当试图找到thisquestion的答案时,我写了这个小测试程序:#include#include#include#include#includevoidwriteFile(){intdata[]={0,1,2,3,4,5,6,7,8,9,1000};std::basic_ofstreamfile("test.data",std::ios::binary);std::copy(data,data+11,std::ostreambuf_iterator(file));}voidreadFile(){std::basic_ifstreamfile("test.data",std::ios:

c++ - std::vector<int>::clear,常数时间?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Whatisthecomplexityofstd::vector::clear()whenTisaprimitivetype?如果我有一个原始类型的std::vector,我调用clear()(这样push_back从capacity的开头),clear()调用将在常数时间还是线性时间内完成?文档说它会销毁所有元素,但如果元素是int,则应该没有任何东西可以销毁,对吧?编辑:我找到了一个拷贝,其中有一张海报详细解释了实现可以检查析构函数是否微不足道,并给出了一个具有该检查的编译器(GCC)的示例。Whatist

c++ - __int128 @ 最小负值的 UDL(用户定义文字)整数溢出

为了清楚和简单起见,我将缩短以下数字:−170,141,183,460,469,231,731,687,303,715,884,105,728为-170…728170,141,183,460,469,231,731,687,303,715,884,105,727为170…727这些数字表示128位有符号整数(gcc中的__int128)的最小值和最大值。我为这种数据类型实现了用户定义的文字(原始文字),因为gcc不提供定义这种类型常量的方法:_u128forunsigned__int128和_i128为__int128。减号不是UDL的一部分,而是应用于UDL结果的一元减号运算符。因此

C++ uniform_int_distribution 总是在第一次调用时返回 min()

在标准库的至少一个实现中,第一次调用std::uniform_int_distribution不返回随机值,而是返回分布的最小值。也就是说,给定代码:default_random_engineengine(any_seed());uniform_int_distributiondistribution(smaller,larger);autox=distribution(engine);assert(x==smaller);...x实际上会是smaller对于any_seed()的任何值,smaller,或larger.要在家一起玩,您可以尝试codesample在gcc4.8.1中演

c++ - 为什么 int/float 乘法会导致不同的结果?

如果我像下面这样将一个float和一个整数相乘,为什么所有乘法都会导致不同的结果?我的期望是一致的结果。我认为在这两种情况下,int值在乘法之前都会隐式转换为float。但是好像有区别。这种不同处理的原因是什么?intmultiply(floatval,intmultiplier){returnval*multiplier;}intmultiply2(floatval,intmultiplier){returnfloat(val*multiplier);}floatval=1.3f;intresult0=val*int(10);//12intresult1=1.3f*int(10);/

c++ - 为什么在下面的例子中 int(a) 是一个表达式而 int(unsigned(a)) 是一个 type-id?

在[dcl.ambig.res]/2我们发现以下内容:voidfoo(signedchara){sizeof(int(a));//expressionsizeof(int(unsigned(a)));//type-id(ill-formed)}为什么int(a)是一个表达式而int(unsigned(a))是一个type-id?乍一看,我会说两者都是表达式。 最佳答案 int(unsigned(a))的解析和int(unsigneda)一样,都是函数类型 关于c++-为什么在下面的例子中

c++ - 奇怪的 "unsigned long long int"行为

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Howdoyouprintfanunsignedlonglongint?#includeintmain(){unsignedlonglongintn;scanf("%llu",&n);printf("n:%llu\n",n);n/=3;printf("n/3:%llu\n",n);return0;}无论我输入什么,我都会得到非常奇怪的输出,例如:n:1n/3:2863311531或n:2n/3:2863311531或n:1000n/3:2863311864这是什么原因?我应该如何正确执行此操作?(g++3.4

C++ BOOL (typedef int) vs bool 性能

我在某处读到,使用BOOL(typedefint)比使用标准的c++类型bool更好,因为BOOL的大小是4个字节(即4的倍数),并且它将变量的对齐操作保存到寄存器或其他东西中线...这有什么道理吗?我想即使您使用bool(1字节),编译器也会填充堆栈帧以保持4的倍数对齐?我绝不是对齐、寄存器等基础工作方面的专家,所以如果我完全错了,我提前道歉。希望指正。:)干杯! 最佳答案 首先,sizeof(bool)不一定是1。是implementation-defined,让编译器编写者可以自由选择适合目标平台的大小。此外,sizeof(i