singlskv 0 26 января, 2009 Опубликовано 26 января, 2009 · Жалоба Работать с этой переменной в другой функции можно будет только по указателю, который данная функция должна сообщить другой, но не по символическому имени переменной. Я это и имел в виду.("менять ее можно будет...") А мне тут недавно говорили, что статические локальные переменные инициализируются при первом заходе в содержащую их функцию. И совершенно не в стартапе. Вас обманули... :) Ну то есть, конечно, можно представить себе компилятор который будет так поступать, только это очень не эффективно. Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого запуска ее адрес будет постоянным. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 26 января, 2009 Опубликовано 26 января, 2009 · Жалоба Вас обманули... :) Ну то есть, конечно, можно представить себе компилятор который будет так поступать, только это очень не эффективно. Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого запуска ее адрес будет постоянным. Да, проверил - простые встроенные типы к моменту первого входа в функцию уже инициализированы. С другой стороны - объект простого класса инициализируется всё таки уже внутри функции - с обработкой защёлки через __cxa_guard_acquire. Несмотря на то, что такие-же глобальные объекты создаются и инитятся в стартапе. Но не локальные статические. То есть статические локальные объекты всё таки несут в себе определённый оверхед... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 26 января, 2009 Опубликовано 26 января, 2009 · Жалоба Вот с вашей точки зрения в таком коде: void someFunc() { static unsigned char ch; ................ } переменная ch глобальная или локальная ? локальная ясен пень. увидеть нельзя ниоткуда, анлесс через мемори кастинг. вы братцы тут хаккеры ембедеры я гляжу собрались. через мемори - ето не глобальная переменная, ето читать участок памяти ok. из Си стандарда. Немного неправильно обозвал глобальные, да. Онако - время жизни статической переменной внутри функции определено со времени входа в функцию 6.2.4 Storage durations of objects 1 An object has a storage duration that determines its lifetime. There are three storage durations: static, automatic, and allocated. Allocated storage is described in 7.20.3. 2 The lifetime of an object is the portion of program execution during which storage is guaranteed to be reserved for it. An object exists, has a constant address,25) and retains its last-stored value throughout its lifetime.26) If an object is referred to outside of its lifetime, the behavior is undefined. The value of a pointer becomes indeterminate when the object it points to reaches the end of its lifetime. 3 An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup. 4 An object whose identifier is declared with no linkage and without the storage-class specifier static has automatic storage duration. 5 For such an object that does not have a variable length array type, its lifetime extends from entry into the block with which it is associated until execution of that block ends in any way. (Entering an enclosed block or calling a function suspends, but does not end, execution of the current block.) If the block is entered recursively, a new instance of the object is created each time. The initial value of the object is indeterminate. If an initialization is specified for the object, it is performed each time the declaration is reached in the execution of the block; otherwise, the value becomes indeterminate each time the declaration is reached. 6 For such an object that does have a variable length array type, its lifetime extends from the declaration of the object until execution of the program leaves the scope of the declaration.27) If the scope is entered recursively, a new instance of the object is created each time. The initial value of the object is indeterminate. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 января, 2009 Опубликовано 26 января, 2009 · Жалоба Онако - время жизни статической переменной внутри функции определено со времени входа в функцию О господи! Конечно нет. Вы бы хоть РЕАЛЬНО прочитали, то что процитировали. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 26 января, 2009 Опубликовано 26 января, 2009 · Жалоба Немного неправильно обозвал глобальные, да.ага, неправильно, и выделить нужно было другой текст: 3 An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup. Обращу Ваше внимание что в этом пункте вобще ничего не сказанно про место где декларируется static identifier ... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 26 января, 2009 Опубликовано 26 января, 2009 · Жалоба ага, неправильно, и выделить нужно было другой текст: 3 An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup. Обращу Ваше внимание что в этом пункте вобще ничего не сказанно про место где декларируется static identifier ... енивей, глобальные переменные - стстические обьявленные в глобальном скопе. возражения есть? кстати, я все никак не добьюсь - речь о C или C++ ? раные языки, разное определение статик Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 27 января, 2009 Опубликовано 27 января, 2009 · Жалоба вот правильный стандард - C++: The zeroinitialization (8.5) of all local objects with static storage duration (3.7.1) is performed before any other initialization takes place. A local object of POD type (3.9) with static storage duration initialized with constantexpressions is initialized before its block is first entered. An implementation is permitted to perform early initialization of other local objects with static storage duration under the same conditions that an implementation is permitted to statically initialize an object with static storage duration in namespace scope (3.6.2). Otherwise such an object is initialized the first time control passes through its declaration; such an object is considered initialized upon the completion of its initialization. If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration. если мы о C++ ( так как статик внутри функции). если о C, то там в принципе статик по барабану для длительности жизни. вопчем, я победил. :maniac: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 27 января, 2009 Опубликовано 27 января, 2009 · Жалоба вопчем, я победил. :maniac: Вы, как выяснилось, не можете ни думать, ни понимать написанное. Бывает :(. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 27 января, 2009 Опубликовано 27 января, 2009 · Жалоба Вы, как выяснилось, не можете ни думать, ни понимать написанное. Бывает :(. Товарищ Супермодератор - если у Вас нет возражений по существу, прошу держать себя в рамках. Или аргументы в студию Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 27 января, 2009 Опубликовано 27 января, 2009 · Жалоба кстати, я все никак не добьюсь - речь о C или C++ ? раные языки, разное определение статик Ну вроде как и о том и о другом, и речь здесь велась в основном о "static storage duration", как о глобальных переменных а никак об области их видимости... Но если хотите продолжить: вот правильный стандард - C++: (8.5) of all local objects with static storage duration (3.7.1) is performed before any other initialization takes place. Но на этом конечно не будем зацикливаться... Посмотрим тут: A local object of POD type (3.9) with static storage duration initialized with constantexpressions is initialized before its block is first entered. An implementation is permitted to perform early initialization of other local objects with static storage duration under the same conditions that an implementation is permitted to statically initialize an object with static storage duration in namespace scope (3.6.2). Otherwise such an object is initialized the first time control passes through its declaration; such an object is considered initialized upon the completion of its initialization. If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration. Вот очень простой вопрос к Вам, если "exits by throwing an exception" произошел, то lifetime уже началась или еще нет ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 27 января, 2009 Опубликовано 27 января, 2009 · Жалоба Ну вроде как и о том и о другом, и речь здесь велась в основном о "static storage duration", как о глобальных переменных а никак об области их видимости... Но если хотите продолжить: Но на этом конечно не будем зацикливаться... Посмотрим тут: Вот очень простой вопрос к Вам, если "exits by throwing an exception" произошел, то lifetime уже началась или еще нет ? нет, не началась. начнется после успешной инициализации.. собственно, для Си кийворд статик можно опустить - глобал там ето обьявленные прям в теле программы, а статик влияет на визибилити онли Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DimaG 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Я это и имел в виду.("менять ее можно будет...") Вас обманули... :) Ну то есть, конечно, можно представить себе компилятор который будет так поступать, только это очень не эффективно. Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого запуска ее адрес будет постоянным. Локальная статическая переменная будет проинициализирована при первом входе входе в область ее видимости. Память под статическую переменную выделяется на этапе линковки - соответственно живет она все время жизни программы. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Локальная статическая переменная будет проинициализирована при первом входе входе в область ее видимости. Память под статическую переменную выделяется на этапе линковки - соответственно живет она все время жизни программы. да, согласен. 3.7.1 Static storage duration [basic.stc.static] 1 All objects which neither have dynamic storage duration nor are local have static storage duration. The storage for these objects shall last for the duration of the program (3.6.2, 3.6.3). 2 If an object of static storage duration has initialization or a destructor with side effects, it shall not be eliminated even if it appears to be unused, except that a class object or its copy may be eliminated as specified in 12.8. 3 The keyword static can be used to declare a local variable with static storage duration. [Note: 6.7 describes the initialization of local static variables; 3.6.3 describes the destruction of local static variables. ] 4 The keyword static applied to a class data member in a class definition gives the data member static storage duration. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 2 февраля, 2009 Опубликовано 2 февраля, 2009 · Жалоба Модератор. Тема закрыта по просьбе топикстартера. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться