Отвечаю: 1. Когда что запускается не имеет значения. Тем более оно никак не связано с конструктором. Какая именно функция будет вызываться определяется ещё раньше -- на этапе компоновки (компиляции фактически) программы. Мы ж не о интерпретируемом языке (perl, tcl) говорим. Так вот на этапе компиляции если есть свой new, то библиотечный компоноваться в проект не будет. Легко проверить на тривиальной программе (см. ниже), где видно, что свой new вызывется прекрасно из недр библиотечных функций, с одной стороны, а с другой std::cout как-то не вызывает new в типичных случаях...
2. Свой аллокатор можно написать вне зависимости от STL. STL ничем ни мешает, ни помогает.
3. Я тоже писал стартапный код на ассемблере для GCC и для ARM7TDMI... И для других МК тоже.
4. Не двух. Одной FreeRTOS. Идея в том, что часть процессов будут иметь общий сегмент памяти в котором и будет куча для malloc. И в этих процессах можно использовать вовсю библиотеки и всё такое прочее.
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <locale>
using namespace std;
static void* myalloc(size_t size) {
void *retval=malloc(size);
if (!retval) throw std::bad_alloc();
cerr << "ptr =" << hex << retval << dec << endl;
return retval;
}
void *operator new(size_t size) {
cerr << "new " << size << " bytes, ";
return myalloc(size);
}
void *operator new[](size_t size) {
cerr << "new[] " << size << " bytes, ";
return myalloc(size);
}
void operator delete(void *ptr) {
cerr << "delete " << hex << ptr << dec << endl;
return free(ptr);
}
void operator delete[](void *ptr) {
cerr << "delete[] " << hex << ptr << dec << endl;
return free(ptr);
}
int main()
{
locale::global(locale(""));
cerr << "\nprinting localized string:\n";
const char *s="test";
cout << "test " << s << 1.2345 << setw(3) << 1.2345 << flush << setw(2) << s << endl;
return 0;
}
Компиляция и запуск:
[ZX]
$ g++ -Wall new.cpp && ./a.out new 25 bytes, ptr =0x9a5b008 new 141 bytes, ptr =0x9a5b028 new 269 bytes, ptr =0x9a5b0c0 delete 0x9a5b028 new 20 bytes, ptr =0x9a5b028 new[] 112 bytes, ptr =0x9a5b9c0 new[] 112 bytes, ptr =0x9a5ba38 new[] 48 bytes, ptr =0x9a5bab0 new[] 13 bytes, ptr =0x9a5b0a8 new[] 2 bytes, ptr =0x9a5b040 new[] 2 bytes, ptr =0x9a5bae8 new[] 2 bytes, ptr =0x9a5baf8 new[] 13 bytes, ptr =0x9a5bb08 new[] 2 bytes, ptr =0x9a5bb20 new[] 13 bytes, ptr =0x9a5bb30 new[] 13 bytes, ptr =0x9a5bb48 new[] 13 bytes, ptr =0x9a5bb60 new[] 13 bytes, ptr =0x9a5bb78 new[] 13 bytes, ptr =0x9a5bb90 new[] 13 bytes, ptr =0x9a5bba8 new 544 bytes, ptr =0x9a5bbc0 new 12 bytes, ptr =0x9a5bec8 new 12 bytes, ptr =0x9a5bfb8 new 104 bytes, ptr =0x9a5bfc8 new 8 bytes, ptr =0x9a5c038 new 8 bytes, ptr =0x9a5c048 new 12 bytes, ptr =0x9a5c058 new 12 bytes, ptr =0x9a5c148 new 68 bytes, ptr =0x9a5c158 new[] 3 bytes, ptr =0x9a5c1a0 new[] 2 bytes, ptr =0x9a5c1b0 new[] 4 bytes, ptr =0x9a5c1c0 new 12 bytes, ptr =0x9a5c1d0 new 68 bytes, ptr =0x9a5c1e0 new[] 3 bytes, ptr =0x9a5c228 new[] 2 bytes, ptr =0x9a5c238 new[] 5 bytes, ptr =0x9a5c248 new 8 bytes, ptr =0x9a5c258 new 8 bytes, ptr =0x9a5c268 new 20 bytes, ptr =0x9a5c278 new[] 249 bytes, ptr =0x9a5c290 new 200 bytes, ptr =0x9a5c390 new 8 bytes, ptr =0x9a5c540 new 8 bytes, ptr =0x9a5c550 new 16 bytes, ptr =0x9a5c560 new[] 249 bytes, ptr =0x9a5c578 new 1264 bytes, ptr =0x9a5c758 new 12 bytes, ptr =0x9a5d218 new 12 bytes, ptr =0x9a5d308 new 296 bytes, ptr =0x9a5d318 new 8 bytes, ptr =0x9a5d448 new 8 bytes, ptr =0x9a5d458 new 12 bytes, ptr =0x9a5d468 new 12 bytes, ptr =0x9a5d558 new 112 bytes, ptr =0x9a5d568 new[] 3 bytes, ptr =0x9a5d5e0 new[] 8 bytes, ptr =0x9a5d5f0 new[] 16 bytes, ptr =0x9a5d600 new 12 bytes, ptr =0x9a5d618 new 112 bytes, ptr =0x9a5d628 new[] 3 bytes, ptr =0x9a5d6a0 new[] 8 bytes, ptr =0x9a5d6b0 new[] 20 bytes, ptr =0x9a5d6c0 new 8 bytes, ptr =0x9a5d6d8 new 8 bytes, ptr =0x9a5d6e8 new 20 bytes, ptr =0x9a5d6f8 new[] 249 bytes, ptr =0x9a5d710 new 200 bytes, ptr =0x9a5d810 new 8 bytes, ptr =0x9a5d9c0 new 8 bytes, ptr =0x9a5d9d0 new 16 bytes, ptr =0x9a5d9e0 new[] 249 bytes, ptr =0x9a5d9f8 delete 0x9a5b0c0 delete 0x9a5b008 new 141 bytes, ptr =0x9a5b8e0 new 269 bytes, ptr =0x9a5b0c0 delete 0x9a5b8e0 delete 0x9a5b0c0 printing localized string: test test1.23451.2345test sysop@pc:~$
-
- Да, действительно, так можно переопределить глобальный new, в том числе из библиотек. Не подозревал. Спасибо за советы. - VVB(08.01.2014 19:20)
- Попробую на работе ваш пример с кросс-компилятором. Может, действительно, я чего не допонимаю. - VVB(08.01.2014 15:02)
- Самое главное -- нет смысла, скорей, переопределять new. Например в libstdc++ он реализован через malloc: fk0(254 знак., 08.01.2014 15:09)