kouzdra (kouzdra) wrote,
kouzdra
kouzdra

Category:

Язык С++ все-таки велик и могуч (3)

Я тут упомянул, что в С/C++ в какой-то момент таки появились локальные массивы с вычисляемой в runtime длинной (облагороженный alloca, кой грязный и не вполне портабельный хак):
FILE * open (char const * const fpath, char const * const fname, char const * const attrs)
{
    int const lp = strlen(fpath);  
    int const ln = strlen(fname);
    char fulln [lp+ln+2];
    memcpy (fulln,      fpath, lp);
    fulln [lp] = '\';
    memcpy (fulln+lp+1, fname, ln);
    fulln [lp+1+ln] = '\0';
    return fopen (fulln, attrs);
}

Появилось это в GCC во времена незапамятные, в С вставили емнимп в С99, а в С++ - кажется в 11 году.

Я эту фичу начал активно пользовать когда после профиляния одной своей программули довольно большого размера выяснил, что на управление кучей там жрется чуть не половина времени (причем в основном на временные строчки вот примерно как тут). После чего стал по возможности избегать аллокаций в куче там где это совсем просто делается (как вот в этом случае) и сравнительно часто вызывается. Вообще - присматривать за интенсивностью аллокаций в куче и фиксить там где пофиксить просто, а жрет оно много - imho хорошая практика. Не столько потому что оно неэффективно - а потому что использование всей этой плюсовой машинерии с аллокаторами STL дает довольно приличную константу к скорости.

Тогда же кстати придумал еще один паттерн на эту тему, который кажется не особенно известен, хотя тоже удобен и решает проблему - но это в другой раз.
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 13 comments