在哪种情况下,可以在堆栈上分配

In which cases is it okay to allocate on the stack

本文关键字:堆栈 分配 情况下      更新时间:2023-10-16

我当前正在学习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
}

这将在堆栈上创建VkApplicationInfoVkInstanceCreateInfo。离开功能和使用g_instance时,这不会导致一些问题吗?vkCreateInstance是否复制VkApplicationInfoVkInstanceCreateInfo的所有数据?如果是这样,那么官方手册为什么不告诉我这种行为?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创建的所有对象(即vkCreatevkAllocate调用的结果)都是手柄。它们都像指针/参考资料一样,因此您可以自由地将它们传递到而无需担心。

实际的Vulkan结构,例如各种Info对象,用于输入到Vulkan或从Vulkan输出。但是,无论哪种方式,Vulkan都只会在功能调用期间使用它们。因此,您之后与他们做的完全取决于您。

即使输出数据结构(例如VkPhysicalDeviceFeatures)仍然只是C 结构。您以C 允许的任何方式使用它们。他们中的数据没有其他参考文献或指示,指向Vulkan拥有的内存;它们只是一堆价值。

如果您使用VkAllocationCallbacks,则必须小心。该实施将存储内部存储在此结构中的指针。因此,他们需要保持有效,直到您破坏关联对象为止。但是结构本身不会超出您给它的Vulkan调用的持续时间。

如果是这样,那么官方手册为什么不告诉我这种行为?

在第2.3.1节中确实如此。这适用于Vulkan规范中的每个函数,因此并未单独列出每个功能:

应用程序拥有的内存立即被其传递到的任何Vulkan命令消耗。一旦消耗命令返回的命令,该应用程序就可以更改或释放此内存。