标准库容器的结构中是否有未使用的变量?
Do standard library containers have unused variables in their structure?
我一直在对应用程序进行一些逆向工程,并设法识别了几个标准库容器,例如 std::vector 和 std::map,但我发现使用 std::map 例如,它在指向自身的指针和其余字段(成员指针和计数)之间有 20 个字节。
当我尝试使用 MSVC C++14 甚至 C++17 执行相同操作时,那 20 个字节不存在。所以,我想知道它们是否被禁用,或者该应用程序是否使用该标准库容器的变体?
标准没有规定在标准库的任何容器中都需要有未使用的变量。
一个特定的标准库实现是否做这样的事情,你可以通过阅读他们的来源来验证。由于这些容器是模板,您可能只需阅读 headers 实现是否开源。
我预计这种未使用的变量不太可能存在。
标准库容器未指定在其结构中包含或不包含未使用的变量(或任何填充)。该标准规定了容器必须如何运行以及它们的接口必须是什么,而不是它们必须如何实现。
这样的事情当然不是不可能的——大多数编译器都会向 class 类型添加填充,以便尽可能 CPU-friendly 访问它们的成员。
因为有不同的标准库实现和不同的编译器(实际上我说的是不同的 ABI,所以,松散地,不同的 平台 ),你很可能会遇到差异在这种情况下。
简而言之,从不 为标准库类型假定任何特定布局。编码时,使用他们的标准化接口;当 reverse-engineering 时,尝试找出正在使用的实现,以便您可以参考其源代码。
我一直在对应用程序进行一些逆向工程,并设法识别了几个标准库容器,例如 std::vector 和 std::map,但我发现使用 std::map 例如,它在指向自身的指针和其余字段(成员指针和计数)之间有 20 个字节。
当我尝试使用 MSVC C++14 甚至 C++17 执行相同操作时,那 20 个字节不存在。所以,我想知道它们是否被禁用,或者该应用程序是否使用该标准库容器的变体?
标准没有规定在标准库的任何容器中都需要有未使用的变量。
一个特定的标准库实现是否做这样的事情,你可以通过阅读他们的来源来验证。由于这些容器是模板,您可能只需阅读 headers 实现是否开源。
我预计这种未使用的变量不太可能存在。
标准库容器未指定在其结构中包含或不包含未使用的变量(或任何填充)。该标准规定了容器必须如何运行以及它们的接口必须是什么,而不是它们必须如何实现。
这样的事情当然不是不可能的——大多数编译器都会向 class 类型添加填充,以便尽可能 CPU-friendly 访问它们的成员。
因为有不同的标准库实现和不同的编译器(实际上我说的是不同的 ABI,所以,松散地,不同的 平台 ),你很可能会遇到差异在这种情况下。
简而言之,从不 为标准库类型假定任何特定布局。编码时,使用他们的标准化接口;当 reverse-engineering 时,尝试找出正在使用的实现,以便您可以参考其源代码。