CRT

Тема в разделе "LANGS.C", создана пользователем osox, 17 апр 2011.

  1. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    если клепаем что то без CRT и хотим чтоб вызывались
    конструкторы деструкторы статических объектов и хотим свое то
    вот реализация для тех кто этого еще неделал
    Код (Text):
    1. #include <windows.h>
    2.  
    3.  
    4.  
    5.  
    6.  
    7. struct io
    8. {
    9.     io()
    10.     {
    11.         SetConsoleTitle(__FUNCSIG__);
    12.     }
    13.     ~io()
    14.     {
    15.         DebugBreak();
    16.     }
    17. } io_obj;
    18.  
    19.  
    20.  
    21.  
    22. int main()
    23. {
    24. }
    25.  
    26. typedef void(fn_t)();
    27.  
    28. #pragma comment(linker, "/merge:.CRT=.rdata")
    29.  
    30. #pragma data_seg(".CRT$XCA")
    31. extern "C" fn_t * start[] = {0};
    32. #pragma data_seg(".CRT$XCZ")
    33. extern "C" fn_t * finish[] = {0};
    34. #pragma data_seg()
    35.  
    36. void call_dtors();
    37.  
    38. extern "C" void _initterm()
    39. {
    40.     fn_t **p = start, **q = finish;
    41.     while (p < q)
    42.     {
    43.         if (*p)
    44.             (*p)();
    45.         ++p;
    46.     }
    47.     main();
    48.     call_dtors();
    49. }
    50.  
    51. fn_t * dtors[999];
    52. int c_dtors;
    53.  
    54. void call_dtors()
    55. {
    56.     while (c_dtors--)
    57.         dtors[c_dtors]();
    58. }
    59.  
    60. extern "C" int atexit(void (__cdecl *func )( void ))
    61. {
    62.     dtors[c_dtors++] = func;
    63.     return !"unspecified";
    64. }
    точку входа в линкере меняете на _initterm
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ну вообще это можно взять из любой реализации CRT... dtors чет много выделил, повлияет на размер, обычно их делают в районе 32, 64, если ничего не путаю)
    и еще убило эпическое:
    Код (Text):
    1. return !"unspecified"
    поясни пожалуйста эту строчку)
     
  3. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    это строчка говнокода означает что я не хотел думать что там должна возвращать эта функция кому надо сделают
     
  4. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    ээ так он же неинициализированный значит будет иметь нулевой размер
    только после загрузки памяти может много занять
    999 * 4 = 3996 / 1024 = 3,90234375 килобайта
     
  5. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Ммм...вообще, а что такое "статический объект". Тут имеются в виду статические конструкторы классов и деструкторы объектов классов? Просто я видимо не очень силен в понятиях ООП.
     
  6. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    есть три типа памяти
    1) статическая (глобальные и локальные со спецификатором static и в неймспейсах)
    2) автоматическая (стек)
    3) динамическая (куча)
    статические объекты это объекты находящиеся в статической памяти
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    osox
    интересно, правда я применения не совсем вижу тк если пишешь без crc ну так и рассчитывай что пишешь без него =)
     
  8. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Чет я не понял насчет различия статической и динамической памяти...Если скажем у меня код:

    void SomeFunc()
    {
    static char *stroka = "лялялтополя";
    char * str = (char *) malloc (50);
    }

    То stroka будет в статической памяти а str - в динамической?
    И вообще, являются ли статические объекты частью образа файла?
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ну видимо имеется ввиду, что стандартные компиляторские crt под виндой довольно толсты, особенно эта проблема касается вирмейкеров...

    следуя той терминологии, что задал osox - да... но строго говоря str не находится в статической или динамической памяти, тк находится на стеке или в регистре, в зависимости от настроек компилятора... в то время как обе эти переменные указывают на данные: stroka - являющиеся частью PE-файла (вне зависимости от спицификатора static), str - выделенные на куче процесса...

    инициализированные значением - да...
     
  10. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Если это так, то зачем же вызывать деструкторы данных объектов??? Я всегда думал что управление памятью осуществляется лишь для динамически выделяемых участков памяти :dntknw:(
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    конструкторы / деструкторы статически-объявленных классов...

    ЗЫ почему-то я нутром чувствовал, что этот кодец попадет на roвнокод: http://www.govnokod.ru/6384
     
  12. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Статически объявленный класс это:
    static class Vasya
    {
    }

    или
    class Vasya
    {
    }

    SomewhereIn Code
    {
    static Vasya vasya1 = new Vasya();
    }

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