Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在堆上分配内存还是传递工作内存?_C++_C_Memory_Memory Management_Coding Style - Fatal编程技术网

C++ 在堆上分配内存还是传递工作内存?

C++ 在堆上分配内存还是传递工作内存?,c++,c,memory,memory-management,coding-style,C++,C,Memory,Memory Management,Coding Style,函数需要额外内存的情况比较常见 在旧代码中,我经常遇到调用方必须提供额外的空间,并将其作为工作数组传递给函数。我想这会给调用函数留下更多的灵活性,并可能提高性能 另一方面,分配内存保证了内存的实际可用性,并简化了接口 是否有处理这些案件的最佳做法 通常,如果函数需要一个长度未知且最大大小不小的数组,那么正确的方法是使用new或malloc并在堆上分配内存 例如,假设您需要解析一个文件并将其内容读入一个数组,而您不知道该文件有多长,那么使用向量将是正确的方法。然后当你调用push_back()时您

函数需要额外内存的情况比较常见

在旧代码中,我经常遇到调用方必须提供额外的空间,并将其作为工作数组传递给函数。我想这会给调用函数留下更多的灵活性,并可能提高性能

另一方面,分配内存保证了内存的实际可用性,并简化了接口


是否有处理这些案件的最佳做法

通常,如果函数需要一个长度未知且最大大小不小的数组,那么正确的方法是使用
new
malloc
并在堆上分配内存


例如,假设您需要解析一个文件并将其内容读入一个数组,而您不知道该文件有多长,那么使用
向量将是正确的方法。然后当你调用
push_back()时
您添加的元素位于堆的某个位置。

通常,如果您的函数需要一个长度未知且最大大小不小的数组,那么正确的方法是使用
new
malloc
并在堆上分配内存


例如,假设您需要解析一个文件并将其内容读入一个数组,而您不知道该文件有多长,那么使用
向量将是正确的方法。然后当你调用
push_back()时
您添加的元素位于堆的某个位置。

通常,如果您的函数需要一个长度未知且最大大小不小的数组,那么正确的方法是使用
new
malloc
并在堆上分配内存


例如,假设您需要解析一个文件并将其内容读入一个数组,而您不知道该文件有多长,那么使用
向量将是正确的方法。然后当你调用
push_back()时
您添加的元素位于堆的某个位置。

通常,如果您的函数需要一个长度未知且最大大小不小的数组,那么正确的方法是使用
new
malloc
并在堆上分配内存


例如,假设您需要解析一个文件并将其内容读入一个数组,而您不知道该文件有多长,那么使用
向量将是正确的方法。然后,当你调用push_back()
时,你添加的元素会出现在堆的某个地方。

我看到的需要调用者为工作数组分配内存的“旧”代码是在动态内存分配成为计算语言的标准部分之前编写的(或编写了它们的重要组件)。(例如,见Fortran 77)他们之所以不这么做,是因为他们认为这是一种很好的实践,以至于计算机科学还没有发展到足够的程度。除非您出于遗留原因链接到这样的库,否则动态分配是更好的方法。

我看到的需要调用者为工作数组分配内存的“旧”代码是在动态内存分配成为计算语言的标准部分之前编写的(或编写了其中的重要组件)。(例如,见Fortran 77)他们之所以不这么做,是因为他们认为这是一种很好的实践,以至于计算机科学还没有发展到足够的程度。除非您出于遗留原因链接到这样的库,否则动态分配是更好的方法。

我看到的需要调用者为工作数组分配内存的“旧”代码是在动态内存分配成为计算语言的标准部分之前编写的(或编写了其中的重要组件)。(例如,见Fortran 77)他们之所以不这么做,是因为他们认为这是一种很好的实践,以至于计算机科学还没有发展到足够的程度。除非您出于遗留原因链接到这样的库,否则动态分配是更好的方法。

我看到的需要调用者为工作数组分配内存的“旧”代码是在动态内存分配成为计算语言的标准部分之前编写的(或编写了其中的重要组件)。(例如,见Fortran 77)他们之所以不这么做,是因为他们认为这是一种很好的实践,以至于计算机科学还没有发展到足够的程度。除非出于遗留原因链接到这样的库,否则动态分配是更好的方法。

在C代码中,通常让调用方负责内存分配,例如strcpy。问题是被调用的函数不知道它实际可以使用多少内存。因此,C有一些函数,调用方也可以指定最大值,例如strncpy

<>在C++中,如果需要的话,让调用函数处理内存分配是很常见的。例如vector::push_back。但是,C++仍然具有调用方负责的功能,例如:STD:MEMCPY。 因此,没有规则指定其中一个。但是,如果可能的话,最好让被调用函数处理内存分配

仍然存在调用方可以通过参与分配来获得更好性能的情况。示例:调用传递(对向量的引用)向量的函数,被调用的函数将把数据放入向量中。如果调用者知道将添加(push_backed)大量新元素,并且调用者知道大约数量(例如8000到10000),则调用者可以通过在执行调用之前在向量中保留10000个条目来提高性能。所以这就像是一个共同的努力。但是被调用的函数仍然可以安全地处理需要超过10000个条目的情况。

在C代码中