C++ 在哪些情况下可以在堆栈上进行分配

C++ 在哪些情况下可以在堆栈上进行分配,c++,c++11,vulkan,C++,C++11,Vulkan,我目前正在学习Vulkan。在学习多个教程时,重复出现大致相同的代码: VkInstance g_instance; void SetupVulkan(){ VkApplicationInfo appInfo = {}; //Set appInfo attributes VkInstanceCreateInfo instanceInfo = {}; instanceInfo.pApplicationInfo = &appInfo; //Set

我目前正在学习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_实例时,这是否会导致一些问题?
vkCreateInstance
是否正在复制
VkApplicationInfo
VkInstanceCreateInfo
的所有数据?如果是这样,那么为什么官方手册没有告诉我这种行为


相同的模式在整个API中重复。我如何找出在哪些情况下堆栈上的分配是可以的,在哪些情况下应该首选更持久的方式,如堆或全局内存?

记住哪些对象表示您将数据提供给Vulkan,哪些表示Vulkan对象或Vulkan将数据返回给您很重要

VkInstance
是一个Vulkan句柄。这意味着它实际上是一个指针或64位整数之类的东西。您可以将其用作指向对象的指针,而不是对象本身。因此,它在功能上与此没有什么不同:

Type *p
auto error_code = getPtr(&p);
return p;
Vulkan创建的所有对象(即
vkCreate
vkaldocate
调用的结果)都是句柄。它们的行为都类似于指针/引用,因此您可以毫无顾虑地自由传递它们

实际的Vulkan结构,如各种
Info
对象,用于Vulkan的输入或Vulkan的输出。但无论哪种方式,Vulkan只会在函数调用期间使用它们。所以你以后怎么处理它们完全取决于你

甚至输出数据结构,如<>代码> VKPractalDeice特性仍然只是C++结构。你可以用C++允许的任何方式使用它们。其中的数据没有指向Vulkan拥有的内存的额外引用或指针;它们只是一堆价值观

如果您使用
VkAllocationCallbacks
,您必须小心。实现将在内部存储此结构中存储的指针。因此,在销毁关联对象之前,它们必须保持有效。但是结构本身不会在您给它的Vulkan调用的持续时间之后被存储

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

如第2.3.1节所述。这适用于Vulkan规范中的每个函数,因此没有单独列出:

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


记住哪些对象代表您向Vulkan提供数据,哪些对象代表Vulkan对象或Vulkan向您提供数据,这一点很重要

VkInstance
是一个Vulkan句柄。这意味着它实际上是一个指针或64位整数之类的东西。您可以将其用作指向对象的指针,而不是对象本身。因此,它在功能上与此没有什么不同:

Type *p
auto error_code = getPtr(&p);
return p;
Vulkan创建的所有对象(即
vkCreate
vkaldocate
调用的结果)都是句柄。它们的行为都类似于指针/引用,因此您可以毫无顾虑地自由传递它们

实际的Vulkan结构,如各种
Info
对象,用于Vulkan的输入或Vulkan的输出。但无论哪种方式,Vulkan只会在函数调用期间使用它们。所以你以后怎么处理它们完全取决于你

甚至输出数据结构,如<>代码> VKPractalDeice特性仍然只是C++结构。你可以用C++允许的任何方式使用它们。其中的数据没有指向Vulkan拥有的内存的额外引用或指针;它们只是一堆价值观

如果您使用
VkAllocationCallbacks
,您必须小心。实现将在内部存储此结构中存储的指针。因此,在销毁关联对象之前,它们必须保持有效。但是结构本身不会在您给它的Vulkan调用的持续时间之后被存储

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

如第2.3.1节所述。这适用于Vulkan规范中的每个函数,因此没有单独列出:

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

公平的警告,我可能是在胡说八道,尽管我以前见过类似的模式。我对Vulkan一无所知,但我可以想象,
VkApplicationInfo
正在为实例公开一些可能不应该再弄乱的设置内容。本质上,它允许您设置一些东西(我不知道是什么),然后可能会将一些东西复制到您的
VkInstance
。我认为复制的数量很小,而且最小的“运行时”成本比保留基本上已死亡的信息更值得。公平警告,我可能是在胡说八道,尽管我以前见过类似的模式。我对Vulkan一无所知,但我可以想象,
VkApplicationInfo
正在为实例公开一些可能不应该再弄乱的设置内容。本质上,它允许您设置一些东西(我不知道是什么),然后可能会将一些东西复制到您的
VkInstance
。我认为复制的数量很小,而且最小的“运行时”成本比保留基本上死气沉沉的信息更值得。但是这里有一个说明,为什么API通过指针而不是值来获取这些结构?在一张完全不相关的便条中,我在寻找它的同时,发现了一张完全不相关的、令人愉快的便条