Перейти к содержанию
    

Язык С, ARM - простые вопросы

Работать с этой переменной в другой функции можно будет только по указателю,

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

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

 

А мне тут недавно говорили, что статические локальные переменные инициализируются при первом заходе в содержащую их функцию.

И совершенно не в стартапе.

Вас обманули... :)

 

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

только это очень не эффективно.

 

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

запуска ее адрес будет постоянным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вас обманули... :)

 

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

только это очень не эффективно.

 

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

запуска ее адрес будет постоянным.

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

 

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

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

Но не локальные статические.

 

То есть статические локальные объекты всё таки несут в себе определённый оверхед...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот с вашей точки зрения в таком коде:

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Онако - время жизни статической переменной внутри функции

определено со времени входа в функцию

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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 ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ага, неправильно, и выделить нужно было другой текст:

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++ ?

раные языки, разное определение статик

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот правильный стандард - 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Или аргументы в студию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вроде как и о том и о другом, и речь здесь велась в основном о "static storage duration",

как о глобальных переменных а никак об области их видимости...

 

Но если хотите продолжить:

Но на этом конечно не будем зацикливаться...

Посмотрим тут:

Вот очень простой вопрос к Вам, если "exits by throwing an exception" произошел, то lifetime уже началась или еще нет ?

 

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

 

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

а статик влияет на визибилити онли

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

Вас обманули... :)

 

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

только это очень не эффективно.

 

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

запуска ее адрес будет постоянным.

 

Локальная статическая переменная будет проинициализирована при первом входе входе в область ее видимости.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Локальная статическая переменная будет проинициализирована при первом входе входе в область ее видимости.

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

 

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

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...