Ключевое слово "static" в с++

Тема в разделе "WASM.ZEN", создана пользователем iron_nomad, 12 май 2005.

  1. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    rst >




    возможны 2 варианта на уровне ассемблера:
    Код (Text):
    1. foo dd 55555
    2. ;
    3. mov eax, [foo]
    и
    Код (Text):
    1. mov eax, 55555
    При инициализации static const вне объявления класса более вероятна первая форма.
     
  2. serious

    serious New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    33
    Адрес:
    Russia


    Borland имхо, вообще ничего не оптимизирует. Касперски по-моему про это писал...
     
  3. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165




    И как это противоречит тому, что я сказал?

    Если немного некорректно (непонятно) написал, то я имел ввиду, что статики живут в .data а не в хипе\на стеке. И как результат память не аллоцируется для них в рантайме. Инициализация может и скорее всего будет происходить в рантайме. Т.к. статик может быть инициализирован и использован отдельно для каждой единицы компиляции.
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    rst >




    Мои слова это не отрицание, а дополнение :)



    >




    Некоторые компиляторы так возможно и сделают, но IMHO их авторам в таком случае стОит ещё поработать, т.к. смысла в этом нет. Если для каждой единицы компиляции свой будет статик, всё равно можно "инициализацию" на этапе компиляции делать или ещё лучше в виде непосредственного операнда компилировать.
     
  5. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    немного офтопа в вашь медок....



    а вот вопрос зачем static используеться для ОБЫЧНЫХ функций... просто иногда вижу а смысла не пойму аля..



    static int blabla(void){

    return 0;

    }
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    static функция будет локальной для единицы трансляции. Иначе линкер будет искать имя в других модулях.
     
  7. iron_nomad

    iron_nomad New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    30
    Не по статику но все таки,

    Почему когда делаю функцию как инлайн, вызываю ее аж три раза, а олли говорит, что она не инлайн, а обычная проца?
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    когда найчишся говорить версию компилятора и ключи компиляции???
     
  9. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    а какая разница, собсно? inline компилер может проигнорировать - если это МС - то надо forceinline, если считаешь себя умнее компилятора
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Да, если /Os стоИт, то MSVC и проигнорирует inline в большенстве случаев.

    Но я думаю в данном случае было:

    /Ob0 Disables inline expansion, which is on by default.
     
  11. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165




    Все зависит от применения.

    т.к. если статик живет в классе, то он имеет доступ к членам класса как мембер класса (т.е. к private к примеру) НО при этом у него нет this - т.е. он не может без доп. лясок типа static int blabla(CMyClass* pThis) ; получить доступ к мемберам экземпляра - т.е. по дефолту только к таким же статикам как и он.

    Это используется для написаний хелпер-функций, которым не нужен доступ к экземплярам класса. НО тем не менее по структуре логично их держать внутри класса.

    Ещё один вариант - это использование функций-мемберов как C-коллбеков. Т.е. к примеру использовать мембер класса для ThreadProc. там обязательно нужен static stdcall ибо вызов не С++-ный, и this не будет. Но для правильной организации кода функцию нужно держать в классе.
     
  12. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    p.s. А вообще для таких вопросов рекомендую почитать дядю Бльярна, или "большую книгу из Редмонда"

    Static Member FunctionsSee Also

    this Pointer

    Static member functions are considered to have class scope. In contrast to nonstatic member functions, these functions have no implicit this argument; therefore, they can use only static data members, enumerators, or nested types directly. Static member functions can be accessed without using an object of the corresponding class type.

     
  13. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    не так выразился значит.... я понимаю в С++ в контексте класса ... но вот я хотел спросить про Си... тут то зачем?
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
  15. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Ошибку понял.... исправлюсь....