Как std :: string выделяет память в GCC с помощью -fwhole-program? - PullRequest
8 голосов
/ 03 октября 2011

Обновление: Следующая проблема зависит от опции -fwhole-program.

Я немного поигрался с распределением памяти и столкнулся с небольшой загадкой: как в GCC (4.6) std::string выделяет свою память [ edit ] при компиляции с -fwhole-program [/]? * * 1 010

Иметь следующую тестовую программу:

#include <new>
#include <string>
#include <iostream>
#include <cstdlib>

void * operator new(std::size_t n) throw(std::bad_alloc)
{
  void * const p = std::malloc(n);

  if (p == NULL) throw std::bad_alloc();

  std::cerr << "new() requests " << n << " bytes, allocated at " << p << ".\n";

  return p;
}

void operator delete(void * p) noexcept
{
  std::cerr << "delete() at " << p << ".\n";
  std::free(p);
}

int main()
{
  std::string s = "Hello world.";
}

Когда я использую любой другой динамический контейнер (который использует std::allocator<T>), распределитель использует ::operator new, и поэтому я радостно вижу сообщения отладки. Однако с std::string я вообще ничего не вижу. Я уверен, что динамическое распределение происходит, хотя, как я могу подтвердить с помощью valgrind (выделено 13 плюс длина строки). Я просмотрел несколько исходных файлов и стандарт, и я почти уверен, что шаблон std::basic_string<T, std::char_traits<T>, std::allocator<T>>, поэтому я в растерянности, почему я не вижу сообщений от моих замененных функций выделения.

Может кто-нибудь пролить свет на эту головоломку? Что мне делать, чтобы отслеживать распределение строк? Кроме того, кто-нибудь может запустить это через какой-то другой компилятор и посмотреть, если он выдаст какой-либо вывод?

(Например: если я добавлю std::map<int, int> m { { 0, 1 } };, у меня будет вывод new() requests 24 bytes, allocated at 0x8d53028 и т. Д.)

1 Ответ

4 голосов
/ 03 октября 2011

Глядя на вывод g++ ... -S с / без -fwhole-program, видно, что целые пользовательские операторы new / delete вообще не генерируются при использовании fwhole-program.

Я начинаю подозревать, что мы здесь смотрим на ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...