The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Выпуск языка программирования Rust 1.77"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка программирования Rust 1.77" +/
Сообщение от n00by (ok), 26-Мрт-24, 11:46 
>> Так он и спрашивает, чем отличаются.
> Когда я упоминал выше разницу между immutable variable и constant я, кажется,
> всё сказал, не?

Скорее, я не достаточно подробно написал, что такое external linkage и не упомянул про storage duration.

> Я думал он перебирает с троллингом, прикидываясь настолько
> тупым, каких не бывает. Но если это не троллинг, я могу
> объяснить разницу в терминах C/C++.
> Сравни:
>     const int my_constant = 5;
> и
>     enum {
>         my_constant = 5;
>     };

Если речь именно о плюсах, а не Си, то нет существенной в данном контексте (особенно, когда нет static и область видимости не очевидна) разницы. И то и то не занимает места в секции данных, будет подставлено непосредственным операндом в машинную инструкцию. Соответственно этому стандарт плюсов и позволяет использовать первое вместо второго (распространённая практика определять 8-ми разрядные константы как const uint8_t, пока enum мог быть только типа int).

> Первое (в терминах раста)  -- это иммутабельная переменная, второе -- это
> константа. Второе -- это имя для специального значения, которое существует только
> на этапе компиляции и нигде больше. Первое же -- это имя,
> с которым линкеру придётся разбираться, а может оно ещё и в
> таблице символов конечного исполняемого файла окажется.

Это в случае переменных со связыванием. Отсюда при отсутствии static и возникает вопрос, а не определяется ли константа вот так:

void f()
{
  const int my_constant = 5;
}

>> Или вместо указателя на секцию данных получится аллокация всего массива на стеке
> Никто не знает. Если это константа, то это всё на усмотрение компилятора,
> который будет смотреть как эта константа используется, и принимать решение. Может
> ты из этого массива используешь только третий байт, так зачем вообще
> в такой ситуации тратить место под массив, почему бы не подставить
> непосредственно в код значение третьего байта?

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

>> аллокация всего массива на стеке
>> {
>>   const char hello[] = {"Hello, world!"};
>> }
> Сишное мышление детектед.

В Си ничего нет про аллокацию на стеке. Там это называется automatic storage duration, и всякий сишник знает, что стека может вообще не быть.

> Кто сказал, что здесь описаны какие-либо выделения? Например,
> если этот hello не используется, компилятор может выкинуть его полностью в
> процессе оптимизаций.

Ну как кто? Вон выше было "первое же -- это имя, с которым линкеру придётся разбираться". Вот это static storage duration, оно же выделение на этапе трансляции, если на рабоче-крестьянском языке.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка программирования Rust 1.77, opennews, 22-Мрт-24, 14:05  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру