使用可变长度数组有一些开销吗?数组的大小可以在运行时通过命令行参数传递吗?与自动和动态分配数组相比,为什么要引入它?
VLA 确实有一些开销(与“普通”命名的编译时大小的数组相比)。
首先,它具有运行时长度,而且该语言为您提供了在运行时获取数组实际大小的方法(使用sizeof
)。这立即意味着数组的实际大小必须存储在某个地方。这会导致每个阵列的内存开销微不足道。然而,由于 VLA 只能声明为自动对象,因此任何人都不会注意到这种内存开销。这就像声明一个额外的整型局部变量一样。
其次,VLA通常分配在堆栈上,但由于其大小可变,一般情况下在编译时不知道其在内存中的确切位置。因此,底层实现通常必须将其实现为指向内存块的指针。这引入了一些额外的内存开销(对于指针),由于上述原因,这也是完全微不足道的。这也带来了轻微的性能开销,因为我们必须读取指针值才能找到实际的数组。这与访问时获得的开销相同malloc
-ed 数组(并且不要使用命名的编译时大小的数组)。
由于 VLA 的大小是运行时整数值,因此它当然可以作为命令行参数传递。 VLA 并不关心它的大小从何而来。
VLA 是作为运行时大小的数组引入的,具有较低的分配/释放成本。它们适合介于“普通”命名的编译时大小的数组(分配-释放成本几乎为零,但大小固定)和malloc
-ed 数组(具有运行时大小,但分配-释放成本相对较高)。
VLA 遵循与自动(即本地)对象相同的范围相关生命周期规则,这意味着在一般情况下它们无法替换malloc
-ed 数组。它们的适用性仅限于需要具有典型自动生命周期的快速运行时大小的数组的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)