ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
478682 Топик полностью
fk0, легенда (08.01.2014 14:43, просмотров: 462) ответил VVB на По пунктам.
Отвечаю: 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; } Компиляция и запуск:
$ 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:~$ 
[ZX]