rst > возможны 2 варианта на уровне ассемблера: Код (Text): foo dd 55555 ; mov eax, [foo] и Код (Text): mov eax, 55555 При инициализации static const вне объявления класса более вероятна первая форма.
И как это противоречит тому, что я сказал? Если немного некорректно (непонятно) написал, то я имел ввиду, что статики живут в .data а не в хипе\на стеке. И как результат память не аллоцируется для них в рантайме. Инициализация может и скорее всего будет происходить в рантайме. Т.к. статик может быть инициализирован и использован отдельно для каждой единицы компиляции.
rst > Мои слова это не отрицание, а дополнение > Некоторые компиляторы так возможно и сделают, но IMHO их авторам в таком случае стОит ещё поработать, т.к. смысла в этом нет. Если для каждой единицы компиляции свой будет статик, всё равно можно "инициализацию" на этапе компиляции делать или ещё лучше в виде непосредственного операнда компилировать.
немного офтопа в вашь медок.... а вот вопрос зачем static используеться для ОБЫЧНЫХ функций... просто иногда вижу а смысла не пойму аля.. static int blabla(void){ return 0; }
static функция будет локальной для единицы трансляции. Иначе линкер будет искать имя в других модулях.
Не по статику но все таки, Почему когда делаю функцию как инлайн, вызываю ее аж три раза, а олли говорит, что она не инлайн, а обычная проца?
а какая разница, собсно? inline компилер может проигнорировать - если это МС - то надо forceinline, если считаешь себя умнее компилятора
Да, если /Os стоИт, то MSVC и проигнорирует inline в большенстве случаев. Но я думаю в данном случае было: /Ob0 Disables inline expansion, which is on by default.
Все зависит от применения. т.к. если статик живет в классе, то он имеет доступ к членам класса как мембер класса (т.е. к private к примеру) НО при этом у него нет this - т.е. он не может без доп. лясок типа static int blabla(CMyClass* pThis) ; получить доступ к мемберам экземпляра - т.е. по дефолту только к таким же статикам как и он. Это используется для написаний хелпер-функций, которым не нужен доступ к экземплярам класса. НО тем не менее по структуре логично их держать внутри класса. Ещё один вариант - это использование функций-мемберов как C-коллбеков. Т.е. к примеру использовать мембер класса для ThreadProc. там обязательно нужен static stdcall ибо вызов не С++-ный, и this не будет. Но для правильной организации кода функцию нужно держать в классе.
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.
не так выразился значит.... я понимаю в С++ в контексте класса ... но вот я хотел спросить про Си... тут то зачем?