传递指针,然后将可变长度数组分配给堆栈

时间:2019-02-08 22:38:58

标签: c++ arrays variable-length-array

是否可以将一个可变长度的数组从一个函数分配给另一个函数的堆栈?

一种可行的方法是预先分配尽可能大的大小,但是我想知道是否有避免这种情况的方法。

void outside_function(){

char[] place_to_allocate_stack_array;

size_t array_size = allocate_and_fill_array(place_to_allocate_stack_array);

//do stuff with the now allocated variable length array on stack

}

size_t allocate_and_fill_array(char* place_to_allocate){

//does some stuff to determine how long the array needs to be
size_t length= determine_length();
//here I want to allocate the variable length array to the stack,
//but I want the outside_function to still be able to access it after
//the code exits allocate_and_fill_array
place_to_allocate[length];
//do stuff to fill the array with data
return length;

}

size_t determine_length(){
////unknown calculations to determine required length

}

1 个答案:

答案 0 :(得分:0)

不,甚至忽略了人们对使用可变长度数组(VLA)的担忧。您试图在单个功能中完成太多工作。退后一步,看看你在问什么。

为了保持一致性并避免使用数组,我将重命名一些东西。考虑以下版本的设置:

class X; // instead of "char []" so we can drop the VLA baggage

size_t inner_function(X & data) { // was "allocate_and_fill_array"
    // Determine how data should be allocated
    // Do stuff with data
}

void outer_function() {
    X data;
    size_t data_size = inner_function(data);
}

要求#1::内部函数需要访问在外部函数中声明的变量。这要求将变量作为参数传递给内部函数。反过来,这要求在声明变量之后调用内部函数。

要求#2::内部函数确定data的分配方式(在声明时发生)。这要求在声明变量之前先调用内部函数。

这些要求有矛盾的前提。不可能。


我想到一个问题:是什么导致您采用这种方法?您已经编写了一个单独的determine_length函数。让outside_function调用它,声明VLA,然后将VLA和长度传递给内部函数。在概念上要简单得多。

size_t determine_length() {
    // unknown calculations to determine required length
}

void fill_array(char* stack_array, size_t length) {
    //do stuff to fill the array with data
}

void outside_function(){
    size_t length = determine_length();
    char stack_array[length];
    fill_array(stack_array, length);
    //do stuff with the variable length array on stack
}

仍然,这种对将数据存储在堆栈上的痴迷可能是premature。尽管堆存储的价格确实比堆栈存储的价格高,但这种差异通常不值得担心。在跳过障碍调整性能之前,使程序正常运行。关注稳健性。仅在分析器确定性能瓶颈后才花时间。