Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Windows内核中使用std::map?港口?_C++_Windows_Stl_Cross Platform_Kernel - Fatal编程技术网

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