我正在用的dynamic_cast这个奇怪的运行时异常,但只有当我填的是我与使用零铸造的对象memset,或者只是一些数据复制到它memcpy。这是生成异常的示例。
class Base
{
public:
virtual void func() { }
};
class Derived : public Base
{
public:
void func() override { }
};
int main()
{
Derived derived;
Base* base_ptr = &derived;
memset(base_ptr, 0, sizeof(Derived));
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);
}
Run Code Online (Sandbox Code Playgroud)
如果我Derived使用 memcpy将一个对象复制到另一个对象,我会得到相同的异常。任何人都知道发生了什么,是否弄乱了dynamic_cast使用的 RTTI ?
我正在制作一个游戏引擎,它是一个实体组件系统,在程序中的某个时刻,我从一个文件中加载了所有对象及其组件。我实现不同组件的方式是使用继承(每个组件都源自一个基本组件)。当我加载对象及其组件时,我不能只分配组件占用的内存量,我必须使用新的组件名称,因为只有这样 dynamic_cast 才能工作。
我正在使用 Visual Studio 2019。
好的,我们有队列,我们将命令缓冲区提交到队列,我们将渲染通道记录到命令缓冲区,我们将子通道添加到渲染通道。为什么这么复杂。据我所知,我们可以使用子通道来有效地同步我们的命令,并且我们可以一次性将整个队列发送到 GPU。但为什么要使用命令缓冲区和渲染通道。这还不是全部,还有命令池来创建命令缓冲区。为什么我需要多个队列,每个队列有多个命令缓冲区,每个队列有多个渲染通道,每个队列有多个子通道。
命令池对于多线程很有用。好的。所以我可以在我的线程中创建命令缓冲区,为什么我需要两个。如果我可以在子通道中完成所有操作,为什么我需要两个渲染通道,我是否遗漏了一些东西?
需要明确的是,我正在为我的引擎围绕 Vulkan 制作一个包装器或抽象,并试图掌握这些概念。也许这才是真正的问题,我试图在没有足够知识的情况下抽象一切并进行纯粹的 Vulkan 项目,但在我看来,这种方式更容易学习。
我尝试在网上寻找一些解释,但没有任何可以满足我的需要。
c++ ×2
dynamic-cast ×1
gpu ×1
graphics ×1
inheritance ×1
memcpy ×1
memset ×1
rendering ×1
vulkan ×1