8

std::map在我最近的项目中,强烈需要像这样的数据结构。但是,默认实现std::map使用 C++ 异常,这在 Windows 内核中是不允许的。

我认为很难std::map在短时间内重新发明而没有任何错误或性能损失。所以,我想知道 Windows 内核中是否存在替换std::map

STLPort 可能是候选者。但我不知道如何提取其std::map唯一并禁用 C++ 异常。

4

2 回答 2

4

内核模式下的 C++ 代码有几个(严重)限制,这些限制先于没有(完整)标准库的问题。

请参阅http://msdn.microsoft.com/en-us/library/windows/hardware/gg487420.aspx

尽管目前无法为用于内核模式代码的“完全安全”的 C++ 子集提供严格且可测试的定义,但对于通常安全和通常不安全的构造,可以使用一些有用的指南。

内核模式驱动程序的 C++ 问题

Microsoft 开发人员发现了 C++ 对内核模式驱动程序提出特殊问题的许多领域。

内存中的代码

使用 C++ 编写内核模式驱动程序最严重的问题是内存页面的管理,尤其是内存中的代码,而不是数据。重要的是大型驱动程序是可分页的,并且分页代码并不总是在内存中。在系统进入不能发生分页的状态之前,所有需要的代码都必须驻留。

C++ 编译器为非 POD 类和模板生成代码的方式使得知道执行函数所需的所有代码可能去哪里变得特别困难,因此难以使代码安全地可分页。编译器会自动为至少以下对象生成代码。这些对象是“不合规矩的”,开发人员无法直接控制它们插入的部分,这意味着它们可能会在需要时被分页。

  • 编译器生成的代码,例如构造函数、析构函数、强制转换和赋值运算符。(这些通常可以明确提供,但需要注意认识到它们需要提供。)
  • 调整器 thunk,用于在层次结构中的各个类之间进行转换。
  • 虚函数thunk,用于实现对虚函数的调用。
  • 虚函数表 thunk,用于管理基类和多态性。
  • 模板代码体,除非显式实例化,否则在首次使用时发出。
  • 虚函数表本身。

C++ 编译器不提供直接控制这些实体在内存中放置位置的机制。控制内存放置所需的 pragma 在设计时并未考虑到 C++。

图书馆

创建和使用库有许多不同的问题:

  • 导出的 C++ 函数的名称可能因版本而异。
  • 并非所有在用户模式下可用的函数都在内核模式库中可用。
  • 标准模板库旨在处理来自单个 DLL 的数据对象。
于 2013-02-13T01:32:04.700 回答
2

如果您环顾四周,您可能应该找到 std::map 的替代品。为什么需要 std::map,它是你需要的哈希表吗?然后你可能会使用uthash,它是一个 ac imlemented hashtable。

于 2013-02-13T12:43:36.503 回答