basic_string allocator

basic_string allocator

本文关键字:allocator string basic      更新时间:2023-10-16

我想知道这是做什么的:

std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
basic_string<char, std::char_traits<char>, std::allocator<char>>
(&myText, "hello world");

我的第一个猜测是它将"hello world"分配给myText变量如果这是真的,那么在这种情况下它有什么作用:

  if ( v106 == v67 || 
  std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
  basic_string<char, std::char_traits<char>, std::allocator<char>>
  (&v109,"program"), v137 = 1)
  {
    BYTE3(v95) = 0;
  }

这不是一个真正的条件...

我想这是 Hex-Ray 的 IDA 反编译器插件的输出,对吗?这是它显示 std::string 类构造函数调用的方式。 v109 是在堆栈上分配的用于保存std::string实例的内存,而第二个参数 "hello world" 是用于初始化它的字符串。

在多个条件导致相同结果代码的情况下,编译器通常会选择重用先前条件中的(等效)代码片段,以最小化生成的字节码的大小。Hex-Ray 的反编译器插件经常使用逗号运算符显示它们,直到版本 1.5 - 新版本的反编译器可以更好地理解这种情况。

if (v106 == v67)
    BYTE3(v95) = 0;
std::basic_string<char, std::char_traits<char>,
                  std::allocator<char>>
                  ::basic_string<char, 
                      std::char_traits<char>, 
                      std::allocator<char>>(&v109,"program");
v137 = 1;
BYTE3(v95) = 0;

这更有可能看起来像实际来源。将巨大的std::basic_string<...>结构替换为简单的std::string声明使其更具可读性。

if (v106 == v67)
    BYTE3(v95) = 0;
std::string v109("program");
v137 = 1;
BYTE3(v95) = 0;