если клепаем что то без CRT и хотим чтоб вызывались конструкторы деструкторы статических объектов и хотим свое то вот реализация для тех кто этого еще неделал Код (Text): #include <windows.h> struct io { io() { SetConsoleTitle(__FUNCSIG__); } ~io() { DebugBreak(); } } io_obj; int main() { } typedef void(fn_t)(); #pragma comment(linker, "/merge:.CRT=.rdata") #pragma data_seg(".CRT$XCA") extern "C" fn_t * start[] = {0}; #pragma data_seg(".CRT$XCZ") extern "C" fn_t * finish[] = {0}; #pragma data_seg() void call_dtors(); extern "C" void _initterm() { fn_t **p = start, **q = finish; while (p < q) { if (*p) (*p)(); ++p; } main(); call_dtors(); } fn_t * dtors[999]; int c_dtors; void call_dtors() { while (c_dtors--) dtors[c_dtors](); } extern "C" int atexit(void (__cdecl *func )( void )) { dtors[c_dtors++] = func; return !"unspecified"; } точку входа в линкере меняете на _initterm
ну вообще это можно взять из любой реализации CRT... dtors чет много выделил, повлияет на размер, обычно их делают в районе 32, 64, если ничего не путаю) и еще убило эпическое: Код (Text): return !"unspecified" поясни пожалуйста эту строчку)
это строчка говнокода означает что я не хотел думать что там должна возвращать эта функция кому надо сделают
ээ так он же неинициализированный значит будет иметь нулевой размер только после загрузки памяти может много занять 999 * 4 = 3996 / 1024 = 3,90234375 килобайта
Ммм...вообще, а что такое "статический объект". Тут имеются в виду статические конструкторы классов и деструкторы объектов классов? Просто я видимо не очень силен в понятиях ООП.
есть три типа памяти 1) статическая (глобальные и локальные со спецификатором static и в неймспейсах) 2) автоматическая (стек) 3) динамическая (куча) статические объекты это объекты находящиеся в статической памяти
osox интересно, правда я применения не совсем вижу тк если пишешь без crc ну так и рассчитывай что пишешь без него =)
Чет я не понял насчет различия статической и динамической памяти...Если скажем у меня код: void SomeFunc() { static char *stroka = "лялялтополя"; char * str = (char *) malloc (50); } То stroka будет в статической памяти а str - в динамической? И вообще, являются ли статические объекты частью образа файла?
ну видимо имеется ввиду, что стандартные компиляторские crt под виндой довольно толсты, особенно эта проблема касается вирмейкеров... следуя той терминологии, что задал osox - да... но строго говоря str не находится в статической или динамической памяти, тк находится на стеке или в регистре, в зависимости от настроек компилятора... в то время как обе эти переменные указывают на данные: stroka - являющиеся частью PE-файла (вне зависимости от спицификатора static), str - выделенные на куче процесса... инициализированные значением - да...
Если это так, то зачем же вызывать деструкторы данных объектов??? Я всегда думал что управление памятью осуществляется лишь для динамически выделяемых участков памяти (
конструкторы / деструкторы статически-объявленных классов... ЗЫ почему-то я нутром чувствовал, что этот кодец попадет на roвнокод: http://www.govnokod.ru/6384
Статически объявленный класс это: static class Vasya { } или class Vasya { } SomewhereIn Code { static Vasya vasya1 = new Vasya(); } Конечно код довольно непонятный и трудночитаемый, а почему он все-атки на говнокоде?