c++ - UEFI 编译代码中的 STL 容器类

标签 c++ c stl uefi

最近在学习 UEFI(提议的 BIOS 替代品)时,我尝试编写一些东西并使用 EDK2 进行编译。 ides 是生成 .EFI 二进制文件,我可以在进入 UEFI shell 时启动它。我能够这样做。完美!

现在我的代码涉及纯 C 风格(基本上缺少 C++ 功能,例如类、构造函数、虚拟和 STL 容器类)。我想知道我是否可以使用 STL 容器类(如字符串、 vector 、 HashMap )并且仍然能够为 UEFI 编译和运行我的 .EFI?

我研究了一下,发现了很多令人沮丧的地方!基本上,我收集到的是:

  1. UEFI 与 C 紧密相关。开源实现不支持 C++
  2. 不支持新建和删除。
  3. vtable 生成依赖于编译器,因此生成的代码不可移植

除此之外,还有很多东西可以从这个网站学到: UEFI Programming

但不幸的是,我感到很困惑!

我的问题是我可以在我的代码中使用 STL 类 (std::string/std::vector/std::map) 并使用 EDK2 为 UEFI 环境编译它吗?

如果有人能指出我要寻找的解决方案/方向,我将不胜感激。现在,我正在使用的唯一选择是在此处找到的容器的 C 实现: UTHash implementation

有办法吗?

最佳答案

问题不在于内存或 vtable。 UEFI 具有高效的动态内存分配。并且可以实现new和delete。和 vtable 一样,在内部它只是一个普通的 C 结构!但问题是 STL 抛出异常。异常(exception)情况取决于平台/操作系统。在 Windows STL 异常中,底层使用 SEH(结构化异常处理),它依赖于操作系统并且与线程内部密切相关。在 UEFI 中没有这样的机制,但它可以实现。尽管这是一项非常重要的任务。

关于c++ - UEFI 编译代码中的 STL 容器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22170907/

相关文章:

c - 在 C 中使用函数初始化数组变量

c - C 中被调用函数的返回值

c++ - 什么是插入列表 map 的正确方法

c++ - std::deque<char> 上的简单插入-删除-插入给出了奇怪的结果

c++ - Visual Studio : "str() is not a member of std::ostringstream"

python - 我已经安装了 OpenCV C++。我可以在不重新安装库的情况下在 Python 中使用它的功能吗?

c++ - 当构造函数抛出异常时,RAII 是如何工作的?

c++ - glTexImage3D 抛出错误 1282(无效操作)

c++ - 异常处理和从非 fatal error 中恢复

c++ - 从 OS X 迁移到 Linux Red-Hat 时出错