powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С++17] Как работают inline- переменные?
16 сообщений из 16, страница 1 из 1
[С++17] Как работают inline- переменные?
    #39632544
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут приведен такой пример:
header.h:
Код: plaintext
1.
2.
3.
4.
#ifndef _HEADER_H
#define _HEADER_H
inline int MyVar = 42;
#endif


Код: plaintext
1.
2.
3.
4.
source1.h:
#include "header.h"
....
MyVar += 10;


Код: plaintext
1.
2.
3.
4.
source2.h:
#include "header.h"
....
Func(MyVar);



Если предположить, что inline- переменные ведут себя как inline- функции, т.е. подставляют свой код в место использования, то получается несколько экземляров одной переменной + для нетривиальных переменных вызов конструкторов / деструкторов.

Или я не правильно понимаю?
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632553
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть другая проблема: если в my.h ты напишешь
Код: plaintext
1.
2.
3.
4.
#ifndef _HEADER_H
#define _HEADER_H
int MyVar = 42;
#endif


и затем сделаешь в нескольких *.cpp
Код: plaintext
1.
#include "my.h"


то такой код не скомпилируюется.

Я так понимаю эту проблему порешали с помощью "inline".

ИМХО в статье автор напутал немного, написал про *.h вместо cpp.
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632559
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем MyVar это инициализированная глобальная переменная - одна для всего кода.
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632560
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632568
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLЕсли предположить, что inline- переменные ведут себя как inline- функции, т.е. подставляют свой код в место использованияЭто второстепенное свойство inline-функций. Главное свойство — это взаимодействие с One ODR-rule. Функция без inline должна быть определена только один раз, а inline — в каждой единице трансляции, в которой используется.

Также и с переменными.
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632595
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a guestЭто второстепенное свойство inline-функций. Главное свойство — это взаимодействие с One ODR-rule. Функция без inline должна быть определена только один раз, а inline — в каждой единице трансляции, в которой используется.

Также и с переменными.

Насколько я понимаю h- файл с инлайн- переменной включается в каждый cpp- файл, которые используют эту переменную, и потому эта переменная становится определена в каждой единице трансляции. Но вот вопрос избыточного вызова конструкторов / деструкторов меня беспокоит (хоть он и "второстепенный").

Получается в каждой единице трансляции будет создан самостоятельный независимый объект, который со временем надо будет удалять?
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632600
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLПолучается в каждой единице трансляции будет создан самостоятельный независимый объект, который со временем надо будет удалять?Нет.
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632603
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a guestAlekseySQLПолучается в каждой единице трансляции будет создан самостоятельный независимый объект, который со временем надо будет удалять?Нет.

Спасибо!
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632605
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПолучается в каждой единице трансляции будет создан самостоятельный независимый объект, который со временем надо будет удалять?
Прочитайте вышеприведенную ссылку http://en.cppreference.com/w/cpp/language/inline
Там помимо прочих важных вещей сказано что если не указано слово static то inline переменная/функция будет иметь одинаковый адрес во всех единицах трансляции. Т.е. будет всего один экземпляр на всю программу.
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632611
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТам помимо прочих важных вещей сказано что если не указано слово static то inline переменная/функция будет иметь одинаковый адрес во всех единицах трансляции. Т.е. будет всего один экземпляр на всю программу.
Если честно, то применительно к инлайн-функциям мне эта формулировка взрывает мозг.

Я понимаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
inline int foo(int x) {
   return x + 1;
}

...

int a = foo(b);
int c = foo(d);


этот код в итоге будет скомпилирован как
Код: plaintext
1.
2.
int a = b + 1;
int c = d + 1;


И где тут " одинаковый адрес во всех единицах трансляции" ?
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632616
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Имеется в виду случай когда функция незаинлайнена.
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632625
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tэтот код в итоге будет скомпилирован как

Это если компилятор решит прислушаться к рекомендации и действительно функцию заинлайнит.
А он ведь может и проигнорить...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632634
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, а можно еще один ламерский вопрос:

если у меня контейнер объявлен сonst, то это запрещает добавлять/удалять элементы или также нельзя менять значения элементов контейнера?

Код: plaintext
1.
2.
3.
const std::vector<int> A{1, 2, 3};
A.push_back(4); //нельзя
А[0] = 12; //Можно?
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632641
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Тоже нельзя. Только буковки A у тебя разные.
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632642
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadAlekseySQL,

Тоже нельзя. Только буковки A у тебя разные.

Пасибки!
...
Рейтинг: 0 / 0
[С++17] Как работают inline- переменные?
    #39632903
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА он ведь может и проигнорить...тогда можно __forceinline (для MS точно, для остальных не знаю)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / [С++17] Как работают inline- переменные?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]