C++ 如何在Windows内核中使用std::map?港口?
在我最近的项目中,强烈需要像C++ 如何在Windows内核中使用std::map?港口?,c++,windows,stl,cross-platform,kernel,C++,Windows,Stl,Cross Platform,Kernel,在我最近的项目中,强烈需要像std::map这样的数据结构。但是,代码> STD::MAP的默认实现使用C++异常,Windows窗口中不允许使用。 我认为很难在短时间内彻底改造std::map,而不产生任何bug或性能损失。因此,我想知道Windows内核中是否存在std::map的替换 STLPort可能是一个候选者。但是我不知道如何提取它的代码> STD::MAP< /C> >,并且禁用C++异常。内核模式中的 < P> C++代码有几个(严重)限制,在没有(完全)标准库的问题之前。 看
std::map
这样的数据结构。但是,<>代码> STD::MAP的默认实现使用C++异常,Windows窗口中不允许使用。
我认为很难在短时间内彻底改造std::map
,而不产生任何bug或性能损失。因此,我想知道Windows内核中是否存在std::map
的替换
STLPort可能是一个候选者。但是我不知道如何提取它的代码> STD::MAP< /C> >,并且禁用C++异常。内核模式中的 < P> C++代码有几个(严重)限制,在没有(完全)标准库的问题之前。 看
虽然目前不可能对内核模式代码中使用的C++的“完全安全”子集提供严格和可测试的定义,但对于通常安全的结构和通常不适用的构造,有一些有用的指导原则。 及
内核模式驱动程序C++问题 <>微软开发者发现了许多领域,其中C++为内核模式驱动提出了特殊的问题。 内存中的代码 <>使用C++编写内核模式驱动程序最严重的问题是 管理内存页,特别是内存中的代码,而不是数据。信息技术 重要的是,大型驱动程序是可分页的,分页代码并不总是在 记忆。所有需要的代码必须在 系统进入无法进行分页的状态 < > C++编译器为非POD类和模板生成代码的方式 这使得知道所有需要的代码都在哪里变得特别困难 执行一个函数可能会失败,因此很难使代码安全 可分页。编译器至少会自动生成 以下对象。这些对象被放在“线外”,开发人员必须 无法直接控制插入它们的节,这意味着 在需要的时候,他们可能会被呼出- 编译器生成的代码,如构造函数、析构函数、强制转换和 赋值运算符。(这些通常可以明确提供,但是 需要注意认识到需要提供它们。)
- 调整器thunks,用于在层次结构中的不同类之间转换
- 虚拟函数thunks,用于实现对虚拟函数的调用
- 虚拟函数表thunks,用于管理基类和多态性
- 模板代码体,在第一次使用时发出,除非显式实例化
- 虚拟函数表本身
C++编译器没有提供直接控制的机制 这些实体被放置在内存中。控制内存所必需的杂注 布局并不是用C++来设计的。 图书馆 在创建和使用库时,有许多不同的关注点:
-
导出的C++函数的名称可以从一个版本到另一个版本不同。
- 并非所有在用户模式下可用的函数都在内核模式库中可用
- 标准模板库设计用于处理单个DLL中的数据对象
如果您环顾四周,可能会找到std::map的替代品。
为什么需要std::map,它是您需要的哈希表吗?然后您可能会使用一个c实现的哈希表。和是最先想到的两件事。用
vector
迭代器无效规则自己编写一个应该非常简单明了。在map
中抛出什么?我所能看到的是,如果您的分配器或compare对象抛出它将抛出的对象(您可以自己提供这些对象),但其他任何对象都不会抛出,是吗?@Dave,编译器将生成异常处理程序代码,这与具有自己异常机制的Windows内核不兼容。这与是否在运行时引发异常无关。请尝试在禁用异常的情况下编译,并且不要使用map::at
?如果您的默认分配器抛出异常(我不知道是否会),您可能还必须将分配器替换为不抛出异常的分配器。是的,使用std::vector
编写关联容器很容易:如果您的map
使用的是“填充映射,使用映射”,而不是“添加、删除、使用、添加、删除、使用、清洗、重复”,则基于std::vector
的关联容器比map
快得多,并且使用的内存更少。默认情况下,驾驶员代码始终驻留在非分页内存中;除了那些明确声明某些代码是可分页的代码外,例如,#pragma alloc_text(PAGE,…)。@xmllmx“默认情况下”是重要部分。但是,如果您知道您的函数只在调度级别下运行
,那么您真的希望将其标记为PAGED\u code()
,并使用所说的#pragma
。