草庐IT

c++ - 固定大小数组与 alloca(或 VLA)

alloca()何时比通过声明固定大小的数组在堆栈上分配内存更可取?详细信息:众所周知,alloca()是一个有争议的函数。使用不当,会导致堆栈溢出。如果使用得当,它可以通过避免堆分配从紧密循环中缩短几纳秒。在thisquestion关于为什么alloca被认为是不好的,一些HitTest门的答案提倡偶尔使用alloca。另一种从堆栈分配的方法是简单地声明一个固定大小的数组。在HowardHinnant'sstackallocator中的arena类中可以找到此策略的示例。.(该代码当然是C++,但该概念仍然适用于C。)使用alloca与固定大小数组的权衡是什么?什么时候,如果有的话,

c++ - 跳转到 VLA 阵列上时出现段错误

下面的例子演示了这个问题:#includeintmain(){unsignedintremaining=1;gotoloop;while(remaining){unsignedchartmp[remaining];printf("&tmp:%p\n",tmp);loop:remaining=512;//orsomethingelse;}}最初,“remaining”变量的初始化有点长,我使用goto在一行中对其进行初始化。然而,现在这个例子在printf行给出了段错误。看起来数组没有正确初始化。即使gdb也无法打印tmp数组的地址:ProgramreceivedsignalSIGSEG

c++ - 可变长度数组 VLA(静态绑定(bind)或动态)

我已经很久没有在基本的编译器中使用基本数组进行编程了,但是最近我看到了这样的数组声明:inty;cin>>y;intz[y];过去的编译器常常给出错误“数组的存储大小不是常量”。然后我发现了C99中的可变大小数组。我想知道他们是如何在内部运作的。这会使数组动态化吗?这个内存是在堆上分配的吗?这种绑定(bind)是否仍然是静态完成的?如果是这样的话。 最佳答案 VariableLengthArray(VLA)是C99的一个特性,但包括gcc在内的几个编译器支持VLAasanextension在C99和gcc之外和clang在C++中支

c++ - C++ 编译器中的可变长度数组 (VLA)

我们已经知道,VLA(在C99中标准化)不是C++标准的一部分。所以下面的代码在C++中是“非法的”:voidfoo(intn){intvla[n];for(inti=0;i尽管如此,编译器(g++和clang++)接受代码作为有效语法,只产生一个警告以防-pedantic标志启用。ISOC++forbidsvariablelengtharray‘vla’[-Wvla]我的问题是:为什么编译器接受该声明?编译器不能拒绝长度为[is-no-know-at-compile-time]的数组?是否有某种兼容性语法规则可遵循?标准说明了什么?从生成的汇编代码中,我看到编译器在堆栈中写入在循环中

c++ - C++中的可变长度数组开销?

看这个问题:WhydoesaC/C++compilerneedknowthesizeofanarrayatcompiletime?我突然想到,编译器实现者现在应该有一些时间来涉足(这是10年前的C99标准的一部分)并提供高效的实现。但是,它似乎(从答案中)仍然被认为是昂贵的。这让我有些吃惊。当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这还没有被测量;)]但我仍然对假定的成本感到惊讶:据我所知,如果函数中没有VLA,那么就不会产生任何成本。如果只有一个VLA,那么可以将它放在所有变量之前或之后,因此可以

c++ - C++中的可变长度数组开销?

看这个问题:WhydoesaC/C++compilerneedknowthesizeofanarrayatcompiletime?我突然想到,编译器实现者现在应该有一些时间来涉足(这是10年前的C99标准的一部分)并提供高效的实现。但是,它似乎(从答案中)仍然被认为是昂贵的。这让我有些吃惊。当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这还没有被测量;)]但我仍然对假定的成本感到惊讶:据我所知,如果函数中没有VLA,那么就不会产生任何成本。如果只有一个VLA,那么可以将它放在所有变量之前或之后,因此可以

c++ - C99 风格的 VLA 有哪些技术缺点?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我听很多人说C99中引入的可变长度数组很糟糕。一分钟前IRC上的一些人说“我认为C++不会获得VLA,strousoup对它们发表了一些非常负面的评论”。那些人讨厌VLA的原因是什么?

c++ - 未记录的 GCC 扩展 : VLA in struct

在阅读Clang文档时,我发现了以下有趣的花絮:[1]clangdoesnotsupportthegccextensionthatallowsvariable-lengtharraysinstructures.Thisisforafewreasons:one,itistrickytoimplement,two,theextensioniscompletelyundocumented,andthree,theextensionappearstoberarelyused.Notethatclangdoessupportflexiblearraymembers(arrayswithazero

C++ 替换 C99 VLA(目标 : preserve performance)

我正在将一些大量使用可变长度数组(VLA)的C99代码移植到C++。我用在堆上分配内存的数组类替换了VLA(堆栈分配)。性能损失巨大,下降了3.2倍(参见下面的基准)。我可以在C++中使用哪些快速VLA替换?我的目标是在为C++重写代码时尽量减少性能损失。向我建议的一个想法是编写一个数组类,该类在类中包含一个固定大小的存储(即可以堆栈分配)并将其用于小型数组,并自动切换到较大数组的堆分配.我的实现在帖子的末尾。它工作得相当好,但我仍然无法达到原始C99代码的性能。为了接近它,我必须将这个固定大小的存储(MSL下面)增加到我不喜欢的大小。我不想在堆栈上分配太大的数组即使对于许多不需要它的