在哪种情况下,可以在堆栈上分配
In which cases is it okay to allocate on the stack
我当前正在学习Vulkan。在研究几个教程时,大致相同的代码反复出现:
VkInstance g_instance;
void SetupVulkan(){
VkApplicationInfo appInfo = {};
//Set appInfo attributes
VkInstanceCreateInfo instanceInfo = {};
instanceInfo.pApplicationInfo = &appInfo;
//Set ICI attributes
VkResult result = vkCreateInstance(&instanceInfo, NULL, &g_instance);
//Error handling
}
这将在堆栈上创建VkApplicationInfo
和VkInstanceCreateInfo
。离开功能和使用g_instance
时,这不会导致一些问题吗?vkCreateInstance
是否复制VkApplicationInfo
和VkInstanceCreateInfo
的所有数据?如果是这样,那么官方手册为什么不告诉我这种行为?https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkcreateineinstance.html
在整个API中重复相同的模式。在堆栈上的哪些情况下,我该如何确定,在哪些情况下,应更持久的方式(例如堆或全局内存)?
重要的是要记住哪些对象表示您将数据提供给Vulkan,哪些代表Vulkan对象或Vulkan将数据还给您。
VkInstance
是一个Vulkan手柄。这意味着它实际上是指针或64位整数或某些套件。您将其像指向对象的指针一样,而不是对象本身。因此,它在功能上没有什么不同:
Type *p
auto error_code = getPtr(&p);
return p;
Vulkan创建的所有对象(即vkCreate
或vkAllocate
调用的结果)都是手柄。它们都像指针/参考资料一样,因此您可以自由地将它们传递到而无需担心。
实际的Vulkan结构,例如各种Info
对象,用于输入到Vulkan或从Vulkan输出。但是,无论哪种方式,Vulkan都只会在功能调用期间使用它们。因此,您之后与他们做的完全取决于您。
即使输出数据结构(例如VkPhysicalDeviceFeatures
)仍然只是C 结构。您以C 允许的任何方式使用它们。他们中的数据没有其他参考文献或指示,指向Vulkan拥有的内存;它们只是一堆价值。
如果您使用VkAllocationCallbacks
,则必须小心。该实施将存储内部存储在此结构中的指针。因此,他们需要保持有效,直到您破坏关联对象为止。但是结构本身不会超出您给它的Vulkan调用的持续时间。
如果是这样,那么官方手册为什么不告诉我这种行为?
在第2.3.1节中确实如此。这适用于Vulkan规范中的每个函数,因此并未单独列出每个功能:
应用程序拥有的内存立即被其传递到的任何Vulkan命令消耗。一旦消耗命令返回的命令,该应用程序就可以更改或释放此内存。
- 从堆栈分配的原始指针构造智能指针
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- C++析构函数调用两次,堆栈分配的复合对象
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 何时在函数中声明堆栈分配变量?
- 使用 std::map 的递归堆栈分配如何工作?
- tcmalloc 与纯堆栈分配性能有多接近
- 安全分配堆栈分配的阵列
- C++ 中的黑白堆分配对象和堆栈分配对象的性能差异
- 跟踪(堆栈分配)对象
- 堆栈分配的确切时间
- 未初始化的值是由堆栈分配 - Qt - C++创建的
- 用于堆栈分配对象的C++虚拟析构函数内联
- C STD :: BAD_ALLOC来自堆栈分配
- 是使用COM创建的对象,将采用分配或堆栈分配的内存
- C++ 中针对大型的堆栈分配
- 堆栈分配的向量如何在 C++ 中扩展