реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Closed TopicStart new topic
> Язык С, ARM - простые вопросы
singlskv
сообщение Jan 26 2009, 21:29
Сообщение #46


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(rezident @ Jan 26 2009, 23:40) *
Работать с этой переменной в другой функции можно будет только по указателю,
который данная функция должна сообщить другой, но не по символическому имени переменной.

Я это и имел в виду.("менять ее можно будет...")

Цитата(sonycman @ Jan 27 2009, 00:07) *
А мне тут недавно говорили, что статические локальные переменные инициализируются при первом заходе в содержащую их функцию.
И совершенно не в стартапе.

Вас обманули... smile.gif

Ну то есть, конечно, можно представить себе компилятор который будет так поступать,
только это очень не эффективно.

Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого
запуска ее адрес будет постоянным.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 26 2009, 21:51
Сообщение #47


Любитель
*****

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



Цитата(singlskv @ Jan 27 2009, 01:29) *
Вас обманули... smile.gif

Ну то есть, конечно, можно представить себе компилятор который будет так поступать,
только это очень не эффективно.

Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого
запуска ее адрес будет постоянным.

Да, проверил - простые встроенные типы к моменту первого входа в функцию уже инициализированы.

С другой стороны - объект простого класса инициализируется всё таки уже внутри функции - с обработкой защёлки через __cxa_guard_acquire.
Несмотря на то, что такие-же глобальные объекты создаются и инитятся в стартапе.
Но не локальные статические.

То есть статические локальные объекты всё таки несут в себе определённый оверхед...
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 26 2009, 22:07
Сообщение #48


Знающий
****

Группа: Участник
Сообщений: 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.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 26 2009, 22:52
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(A. Fig Lee @ Jan 27 2009, 01:07) *
Онако - время жизни статической переменной внутри функции
определено со времени входа в функцию


О господи! Конечно нет. Вы бы хоть РЕАЛЬНО прочитали, то что процитировали.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 26 2009, 22:52
Сообщение #50


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(A. Fig Lee @ Jan 27 2009, 01:07) *
Немного неправильно обозвал глобальные, да.
ага, неправильно, и выделить нужно было другой текст:
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 ...
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 26 2009, 23:46
Сообщение #51


Знающий
****

Группа: Участник
Сообщений: 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++ ?
раные языки, разное определение статик


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 27 2009, 14:42
Сообщение #52


Знающий
****

Группа: Участник
Сообщений: 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, то там в принципе статик по барабану для длительности жизни.


вопчем, я победил. maniac.gif


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 27 2009, 16:10
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(A. Fig Lee @ Jan 27 2009, 17:42) *
вопчем, я победил. maniac.gif

Вы, как выяснилось, не можете ни думать, ни понимать написанное. Бывает sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 27 2009, 16:23
Сообщение #54


Знающий
****

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



Цитата(zltigo @ Jan 27 2009, 11:10) *
Вы, как выяснилось, не можете ни думать, ни понимать написанное. Бывает sad.gif.


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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 27 2009, 22:27
Сообщение #55


дятел
*****

Группа: Свой
Сообщений: 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 уже началась или еще нет ?
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 27 2009, 23:44
Сообщение #56


Знающий
****

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



Цитата(singlskv @ Jan 27 2009, 17:27) *
Ну вроде как и о том и о другом, и речь здесь велась в основном о "static storage duration",
как о глобальных переменных а никак об области их видимости...

Но если хотите продолжить:
Но на этом конечно не будем зацикливаться...
Посмотрим тут:
Вот очень простой вопрос к Вам, если "exits by throwing an exception" произошел, то lifetime уже началась или еще нет ?


нет, не началась. начнется после успешной инициализации..

собственно, для Си кийворд статик можно опустить - глобал там ето обьявленные прям в теле программы,
а статик влияет на визибилити онли


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Jan 28 2009, 10:21
Сообщение #57


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(singlskv @ Jan 27 2009, 01:29) *
Я это и имел в виду.("менять ее можно будет...")


Вас обманули... smile.gif

Ну то есть, конечно, можно представить себе компилятор который будет так поступать,
только это очень не эффективно.

Ну и главное что память под такую переменную уже будет отведена компилятором, те к моменту первого
запуска ее адрес будет постоянным.


Локальная статическая переменная будет проинициализирована при первом входе входе в область ее видимости.
Память под статическую переменную выделяется на этапе линковки - соответственно живет она все время жизни программы.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 28 2009, 14:45
Сообщение #58


Знающий
****

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



Цитата(Dima_G @ Jan 28 2009, 05:21) *
Локальная статическая переменная будет проинициализирована при первом входе входе в область ее видимости.
Память под статическую переменную выделяется на этапе линковки - соответственно живет она все время жизни программы.


да, согласен.

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.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 2 2009, 21:01
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Модератор. Тема закрыта по просьбе топикстартера.
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 08:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016