标准库容器的结构中是否有未使用的变量?

问题描述

我已经在应用程序上进行了一些逆向工程,并设法识别了几个标准库容器,例如std :: vector和std :: map,但是我使用std :: map发现了什么一个例子是它在指向自身的指针与其余字段(成员指针和计数)之间有20个字节。

当我尝试使用MSVC C ++ 14甚至C ++ 17进行相同操作时,这20个字节不存在。因此,我想知道是否已禁用它们,或者该应用程序是否使用该标准库容器的变体?

解决方法

标准库容器没有指定,在其结构中具有或不具有未使用的变量(或任何填充)。该标准规定了容器必须如何行为以及其接口必须是什么,而不是必须如何实现。

这肯定不是不可能的-大多数编译器在类类型中添加填充,以使对它们的成员的访问尽可能对CPU友好。

由于存在不同的标准库实现和不同的编译器(实际上,我在谈论的是不同的ABI,因此,松散地,不同的 platforms ),您很有可能在这种事情上遇到差异

简而言之,从不假定标准库类型的任何特殊布局。编码时,使用其标准化接口;在进行逆向工程时,请尝试找出正在使用的实现,以便您可以引用其源代码。

,

该标准未规定标准库中任何容器中都必须有未使用的变量。

是否特定的标准库实现可以执行此操作,您可以通过阅读其源进行验证。由于这些容器是模板,因此无论实现是否为开源,您都可以简单地读取标头。

我希望这种未使用的变量不太可能存在。