|
|
  |
Язык С, ARM - простые вопросы |
|
|
|
Jan 26 2009, 21:29
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(rezident @ Jan 26 2009, 23:40)  Работать с этой переменной в другой функции можно будет только по указателю, который данная функция должна сообщить другой, но не по символическому имени переменной. Я это и имел в виду.("менять ее можно будет...") Цитата(sonycman @ Jan 27 2009, 00:07)  А мне тут недавно говорили, что статические локальные переменные инициализируются при первом заходе в содержащую их функцию. И совершенно не в стартапе. Вас обманули...  Ну то есть, конечно, можно представить себе компилятор который будет так поступать, только это очень не эффективно. Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого запуска ее адрес будет постоянным.
|
|
|
|
|
Jan 26 2009, 21:51
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(singlskv @ Jan 27 2009, 01:29)  Вас обманули...  Ну то есть, конечно, можно представить себе компилятор который будет так поступать, только это очень не эффективно. Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого запуска ее адрес будет постоянным. Да, проверил - простые встроенные типы к моменту первого входа в функцию уже инициализированы. С другой стороны - объект простого класса инициализируется всё таки уже внутри функции - с обработкой защёлки через __cxa_guard_acquire. Несмотря на то, что такие-же глобальные объекты создаются и инитятся в стартапе. Но не локальные статические. То есть статические локальные объекты всё таки несут в себе определённый оверхед...
|
|
|
|
|
Jan 26 2009, 22:07
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(singlskv @ Jan 26 2009, 14:45)  Вот с вашей точки зрения в таком коде: Код 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.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 26 2009, 23:46
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(singlskv @ Jan 26 2009, 17:52)  ага, неправильно, и выделить нужно было другой текст: 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++ ? раные языки, разное определение статик
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 27 2009, 14:42
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
вот правильный стандард - 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, то там в принципе статик по барабану для длительности жизни. вопчем, я победил.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 27 2009, 16:23
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(zltigo @ Jan 27 2009, 11:10)  Вы, как выяснилось, не можете ни думать, ни понимать написанное. Бывает  . Товарищ Супермодератор - если у Вас нет возражений по существу, прошу держать себя в рамках. Или аргументы в студию
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 27 2009, 22:27
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата кстати, я все никак не добьюсь - речь о 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 уже началась или еще нет ?
|
|
|
|
|
Jan 27 2009, 23:44
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(singlskv @ Jan 27 2009, 17:27)  Ну вроде как и о том и о другом, и речь здесь велась в основном о "static storage duration", как о глобальных переменных а никак об области их видимости...
Но если хотите продолжить: Но на этом конечно не будем зацикливаться... Посмотрим тут: Вот очень простой вопрос к Вам, если "exits by throwing an exception" произошел, то lifetime уже началась или еще нет ? нет, не началась. начнется после успешной инициализации.. собственно, для Си кийворд статик можно опустить - глобал там ето обьявленные прям в теле программы, а статик влияет на визибилити онли
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jan 28 2009, 10:21
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(singlskv @ Jan 27 2009, 01:29)  Я это и имел в виду.("менять ее можно будет...") Вас обманули...  Ну то есть, конечно, можно представить себе компилятор который будет так поступать, только это очень не эффективно. Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого запуска ее адрес будет постоянным. Локальная статическая переменная будет проинициализирована при первом входе входе в область ее видимости. Память под статическую переменную выделяется на этапе линковки - соответственно живет она все время жизни программы.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|