Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250

Как работает union в С++

01.11.2024, 15:47. Показов 5585. Ответов 91
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста.
Как работает union в С++
Везде написано, что элементы union, занимают одну область памяти.
Область памяти размером по наибольшему элементу.

C++
1
2
3
4
5
union Foo
{
   int a;
   char b;
};
Если я присвою int какое либо значение.
И присвою значение для char.
И учитывая, что они занимают одну область памяти.
Значит char должна затереть часть битов int.
И int перестанет иметь прежнее значение.

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2024, 15:47
Ответы с готовыми решениями:

Union как работает?
union U { double f; long l; int d; }; U un; un.f = 0; un.l = 10; cout << un.f; почему выводит 4.94066e-323 ? я так понял это...

union как определить из какой таблице запись после UNION?
Подскажите пожалуйста! Вот например две таблице (TEBLE_1) у которой поля row_1(BIGINT) и (TABLE_2) у которой поля row_2(TEXT) Я ИХ...

функция union что выводит на консоль? как работает?
union U { double f; long l; int d; }; U un; un.f = 0; un.l = 10; cout << un.f; И что выведет на экран?

91
фрилансер
 Аватар для Алексей1153
6479 / 5702 / 1132
Регистрация: 11.10.2019
Сообщений: 15,188
01.11.2024, 18:28
Студворк — интернет-сервис помощи студентам
Verevkin, это не разрешается программисту, а компилятор - он глупый, он верит человеку

Например, не разрешается разыменовывать нулевой или провисший указатель. Не разрешается организовывать гонку данных. Не разрешается нарушать strict aliasing.
Но компилятор всё это преспокойно пропускает.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 18:52
Цитата Сообщение от Verevkin Посмотреть сообщение
Что такое активность члена union?
Попросту выражаясь, тот член, в который последним выполнялась запись - активный. Остальные - неактивны.

Цитата Сообщение от Verevkin Посмотреть сообщение
Это ж просто начальный адрес в памяти. И всё.
При чем здесь начальный адрес в памяти и каким боком это относится к С++ - мне не ясно.

Цитата Сообщение от Verevkin Посмотреть сообщение
то компилятор обязан это не пропустить.
Во-первых, в С++ существует большое количество ошибок времени компиляции, которые являются недиагностируемыми ("no diagnostic required"). Так что ни о каком "обязан" речи никогда не шло даже в случае ошибок, которые компилятор теоретически может отловить

Во-вторых, к "не разрешается" я также отношу неопределенное поведение, как в данном случае.
0
Заблокирован
01.11.2024, 19:30
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Попросту выражаясь, тот член, в который последним выполнялась запись - активный. Остальные - неактивны.
Первый раз такое слышу. Пруфы, хоть, дай.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
При чем здесь начальный адрес в памяти и каким боком это относится к С++ - мне не ясно.
Ну, переменная типа union (и её поля) - это жэж начальный адрес данных, которые она (они) хранит (хранят). А типы полей определяют их размеры, причём самое длинное поле задаёт размер всего union. В Си и паскале - так. Разве в С++ это не так? Почему? А как тогда?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
к "не разрешается" я также отношу неопределенное поведение, как в данном случае.
Я помню, Задорнов говорил про 3 типа "нельзя": "запрещено", "строго запрещено" и "категорически запрещено!!!".
Ну, поржать можно, однако, что не так c кодом моего примера? Что в нём может пойти не так? Покажи, пожалуйста, на практике, а то я не смогу в это поверить: у меня слово "недопустимо" ассоциируется именно c "категорически запрещено".

Очень прошу, Маэстро!

Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это не разрешается программисту, а компилятор - он глупый, он верит человеку
Например, не разрешается разыменовывать нулевой или провисший указатель. Не разрешается организовывать гонку данных. Не разрешается нарушать strict aliasing.
Но компилятор всё это преспокойно пропускает.
Здесь - не тот случай. Не передёргивай.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 19:53
Цитата Сообщение от Verevkin Посмотреть сообщение
Пруфы
In a union, a non-static data member is active if its name refers to an object whose lifetime has begun and has not ended ([basic.life]).
At most one of the non-static data members of an object of union type can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.

[Note 1: One special guarantee is made in order to simplify the use of unions: If a standard-layout union contains several standard-layout structs that share a common initial sequence ([class.mem]), and if a non-static data member of an object of this standard-layout union type is active and is one of the standard-layout structs, the common initial sequence of any of the standard-layout struct members can be inspected; see [class.mem].
— end note]
https://eel.is/c++draft/class.union#general-2

Добавлено через 5 минут
... if the object is a union member or subobject thereof, its lifetime only begins if that union member is the initialized member in the union ([dcl.init.aggr], [class.base.init]), or as described in [class.union], [class.copy.ctor], and [class.copy.assign], and except as described in [allocator.members].
The lifetime of an object o of type T ends when:

(1.3) if T is a non-class type, the object is destroyed, or
(1.4) if T is a class type, the destructor call starts, or
(1.5) the storage which the object occupies is released, or is reused by an object that is not nested within o ([intro.object]).
https://eel.is/c++draft/basic.life#1.2

Т.е. если всё сложить, то при перезаписи одного объекта в union, ты убиваешь (завершаешь жизнь) другого. А значит другой нельзя читать. Читать из него - то же самое, что читать из неинициализированной переменной. Такое же UB.

Добавлено через 2 минуты
А в Note 1 первой цитаты написано вот это:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов. Вот эти общие начальные последовательности можно просматривать, игнорируя соображения текущего активного члена. То есть вот так можно
Добавлено через 2 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
это жэж начальный адрес данных, которые она (они) хранит (хранят)
Не, в C++ - это объекты сперва, а потом уже память. А в C++ нельзя читать из мёртвых объектов. Неважно каким способом ты их получил.
Если ты про это не слышал, то просто видимо не читал никакой серьезной литературы по С++.
1
Заблокирован
01.11.2024, 20:02
Цитата Сообщение от ablex Посмотреть сообщение
Т.е. если всё сложить, то при перезаписи одного объекта в union, ты убиваешь (завершаешь жизнь) другого.
Но поля-то статические, под них выделена память на всё время жизни переменной, ёмаё. Разве время жизни полей не равно времени жизни всего union?

Как это работает на низком уровне-то?
Я понимаю, что там написано, но я не понимаю смысл этого, как это выглядит на практике. Вон у ТС даже картинка в вопросе есть. Как надо подкрутить настройки компилятора, чтобы пример стал выдавать неверный результат?

Добавлено через 4 минуты
Цитата Сообщение от ablex Посмотреть сообщение
Если ты про это не слышал, то просто видимо не читал никакой серьезной литературы по С++.
Иногда меня терзают смутные сомнения, что всё, что написано в серьёзной литературе, правда.
Если взять в качестве примера наш текущий случай, то я ума не разложу, зачем так сделано? Чтобы было неудобно? Получается, что поля каким-то волшебным образом имеют разное время жизни, которое заранее неизвестно. Зачем?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 20:16
Цитата Сообщение от Verevkin Посмотреть сообщение
Первый раз такое слышу.
Ну это уж точно неправда. Тема уже миллион раз тут обсуждалась.

Цитата Сообщение от Verevkin Посмотреть сообщение
Пруфы, хоть, дай.
Вперёд читать стандарт. Ключевые слова я дал: union, active member, lifetime.

Переключение активного члена union заканчивает lifetime предыдущего активного члена. Чтение объекта, чей lifetime закончился - неопределенное поведение. (12.3, 6.8)

Цитата Сообщение от Verevkin Посмотреть сообщение
Ну, переменная типа union (и её поля) - это жэж начальный адрес данных, которые она (они) хранит (хранят).
Какие еще "адреса данных"? Какая разница, какие там адреса? Зачем вы вообще на них смотрите? Это все детали реализации, которые к языку С++ никакого отношения не имеют.

Цитата Сообщение от Verevkin Посмотреть сообщение
Разве в С++ это не так?
Какая разница, так это или не так. Язык С++ говорит, что чтение неактивного члена union - неопределенное поведение. Какая разница, что там "определяет размеры"?

Добавлено через 10 минут
Цитата Сообщение от Verevkin Посмотреть сообщение
Как это работает на низком уровне-то?
Что за набор слов? О какой "работе" (на любом уровне) может идти речь в случае неопределенного поведения?

Цитата Сообщение от Verevkin Посмотреть сообщение
Я понимаю, что там написано, но я не понимаю смысл этого, как это выглядит на практике.
Продолжается поток бессмыслицы. О какой "практике" может идти речь в случае неопределенного поведения?

На практике неопределенное поведение существует для оптимизаций. Компилятор оптимизирует код в рамках уверенности, что неопределенное поведение никогда не происходит. В частности, если неукий код содержит безусловное неопределенное поведение (напр., запись в одно поле union и чтение из другого), значит эта ветвь программы никогда не будет выполняться и код для нее можно не генерировать вообще. А вы нам тут про какие-тот адреса рассказывать пытаетесь...
0
Заблокирован
01.11.2024, 20:17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какие еще "адреса данных"? Какая разница, какие там адреса? Зачем вы вообще на них смотрите? Это все детали реализации, которые к языку С++ никакого отношения не имеют.
Не понял. А как это тогда вообще работает?
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 20:19
Цитата Сообщение от Verevkin Посмотреть сообщение
Иногда меня терзают смутные сомнения, что всё, что написано в серьёзной литературе, правда.
Программист должен уметь читать спецификацию.

Цитата Сообщение от Verevkin Посмотреть сообщение
Чтобы было неудобно?
Нет, просто это не тот инструмент. Хочешь работать с памятью - есть другие средства, предназначенные специально для этого.

Цитата Сообщение от Verevkin Посмотреть сообщение
зачем так сделано?
Чтобы все стройно работало. Если внутри union std::string и int, то такой код что тебе даст? Креш в лучшем случае.
Про strict aliasing почитай.
https://gist.github.com/shafik... ee272a58f8

ОДНАКО, не смотря на это, type punning через union все равно будет работать во многих компиляторах, потому что они (разрабы компиляторов) НАМЕРЕННО НЕ проводят оптимизации aliasing`а (оставляют поведение как в Си). Потому что многие программисты на Си продолжают тащить в Си++ этот приём, и это явление настолько массовое, что проще перестать соответствовать стандарту в этом моменте.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 20:24
Цитата Сообщение от Verevkin Посмотреть сообщение
Но поля-то статические, под них выделена память на всё время жизни переменной, ёмаё. Разве время жизни полей не равно времени жизни всего union?
Нет, конечно. Зачем выделять память под все поля, если в каждый момент времени активно только одно?

О какой вообще "памяти" вы вообще ведете речь? Что такое "выделена"? В С++ понятие "памяти" даже отдаленно не похоже на то, о чем вы здесь рассуждаете.
0
Заблокирован
01.11.2024, 20:26
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какая разница, так это или не так. Язык С++ говорит, что чтение неактивного члена union - неопределенное поведение. Какая разница, что там "определяет размеры"?
Если в стандарте так написано, значит так и есть?
Напоминает мамкин ответ "потому что я так сказала!" на вопрос "почему?".
Я не спорю, я просто пытаюсь разобраться, правда ли это, и почему (и для чего) так сделано. А то получается, что в С++ авторы понапихали UB-ситуаций и считают, что проще подкорректировать под них стандарт, чем исключить.



Как же мне повезло, что на работе я сам выбираю, на чём писать софт.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 20:27
Цитата Сообщение от Verevkin Посмотреть сообщение
Не понял. А как это тогда вообще работает?
Не понимаю вопроса. В чем проблема с "работает"?

Вот я, например, положил в переменную значение 25, не менял ее, и затем прочитал. Компилятор вообще устранил эту переменную, потому что понял, что она всегда равна 25. То есть нет никакой памяти, и при этом все работает.

Где проблема?
0
Заблокирован
01.11.2024, 20:34
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, конечно. Зачем выделять память под все поля, если в каждый момент времени активно только одно?
Поскольку поля находятся по одному адресу, нужно столько памяти, сколько занимает поле максимального размера. Разве это не логично? Компилятор, ведь, знает размер в момент компиляции.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот я, например, положил в переменную значение 25, не менял ее, и затем прочитал. Компилятор вообще устранил эту переменную, потому что понял, что она всегда равна 25. То есть нет никакой памяти, и при этом все работает.
Это не наш случай. Вот если бы ты ничего не изменял, а прочитал бы мог бы прочитать вместо 25 значение 100500, то это UB.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 20:36
Цитата Сообщение от Verevkin Посмотреть сообщение
Если в стандарте так написано, значит так и есть?
Совершенно верно.

Цитата Сообщение от Verevkin Посмотреть сообщение
Напоминает мамкин ответ "потому что я так сказала!" на вопрос "почему?".
Нет. Вот это ^^^ очень характерное заблуждение.

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

Язык С++ же не надо исследовать методом "черного ящика". Он не прилетел к нам с другой планеты на дискете. В него не надо тыкать палкой. Он полностью описан в стандарте и любая реализация - попытка идеально точно соблюсти требования стандарта.


Цитата Сообщение от Verevkin Посмотреть сообщение
Как же мне повезло, что на работе я сам выбираю, на чём писать софт.
А подавляющем большинстве случаев это означает, что аффтар "пишет софт" на языке, который является продуктом его собственных домыслов чуть менее, чем полностью.
0
Заблокирован
01.11.2024, 20:42
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А подавляющем большинстве случаев это означает, что аффтар "пишет софт" на языке, который является продуктом его собственных домыслов чуть менее, чем полностью.
Да пусть, хотя бы, и так. Но аффтара это кормит. Чуть более, чем полностью.
-----
Не надо на личности переходить, это мы так щас до оскорблений опустимся. Не хочу.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 20:45
Цитата Сообщение от Verevkin Посмотреть сообщение
я просто пытаюсь разобраться, правда ли это, и почему (и для чего) так сделано.
Хошь разобраться - читай ссылку, которую я привел. Все остальное от лукавого.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 20:53
Цитата Сообщение от Verevkin Посмотреть сообщение
Поскольку поля находятся по одному адресу, нужно столько памяти, сколько занимает поле максимального размера. Разве это не логично? Компилятор, ведь, знает размер в момент компиляции.
Снова поток каких-то феерических домыслов.

"Адреса" в программе на С++ появляются только после того, как будет применен оператор взятия адреса &. Без этого никаких "адресов" не существует вообще. То же самое и с "размерами" (sizeof, адресная арифметика и т.п.). Без этого никаких размеров не существует вообще, максимальных или минимальных - неважно.

Еще раз повторяю (и я не люблю повторяться): так как активным в union является только один член, памяти всегда нужно ровно столько, сколько занимает это активный член. Никаких "максимальных размеров" здесь нет и не нужно. А все остальное - лишь детали реализации, ничего о сути вопроса нам не сообщающие.

Цитата Сообщение от Verevkin Посмотреть сообщение
Это не наш случай.
Это где я такое сказал? (Постарайтесь чтобы в будущем я не видел здесь подобных однострочных вбросов. Чтобы возражать мне в таких вопросах нужно подготовить странички три-четыре материала с отщывами рецензентов).

Как несложно догадаться, то, к чему я веду, в частности - это что union может располагаться в регистрах процессора и правильный менеджмент этих регистров определяется знанием о текущем активном члене union. Мой пример в том числе об этом.

А вы нам тут рассказываете сказки про какую-то "выделенную память", "максимальный размер", "располагаются на картинке" и т.п Ничего этого в С++ нет и никогда не было. Это пионэрские домыслы.
0
Заблокирован
01.11.2024, 20:55
Цитата Сообщение от ablex Посмотреть сообщение
Хошь разобраться - читай ссылку, которую я привел. Все остальное от лукавого.
За ссылку спасибо.
Раньше я понимал работу union как-то так:



Пойду чаёк заварю...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 21:03
Цитата Сообщение от Verevkin Посмотреть сообщение
.
Раньше я понимал работу union как-то так:
Вот именно такие попытки "понимать" С или С++ через разглядывание сгенерированного машинного кода - это и есть метод "тыканья палкой" в компилятор. Если "ученый" не обладает великолепным знанием стандарта языка, то такое разглядывание приведет лишь к рождению феерических теорий, вроде "безногий таракан не слышит" из известного анекдота.
0
Заблокирован
01.11.2024, 21:16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Снова поток каких-то феерических домыслов.
Пусть это домыслы, но они основаны на практике. Разве sizeof(тип) может вернуть разные размеры в зависимости от его положения в коде?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот именно такие попытки "понимать" С или С++ через разглядывание сгенерированного машинного кода - это и есть метод "тыканья палкой" в компилятор. Если "ученый" не обладает великолепным знанием стандарта языка, то такое разглядывание приведет лишь к рождению феерических теорий, вроде "безногий таракан не слышит" из известного анекдота.
Согласен, пусть это так. Я не учёный, я рабочий. Ответ "так нельзя, потому что это написано в Писании стандарте", меня не устраивает. Я смотрю в сгенерированный машинный код и вижу, что "она вертится".
---------
Пойду спать. Всем спасибо за дискуссию.
0
Модератор
 Аватар для Curry
5160 / 3504 / 536
Регистрация: 01.06.2013
Сообщений: 7,608
Записей в блоге: 9
01.11.2024, 22:04
Цитата Сообщение от Алексей1153 Посмотреть сообщение
union задуман как возможность поэкономить озу. А для реинтерпретации есть memcpy
Почитался я вашу полемику насчёт union. Тут я за Verevkin-а.
Использовать для реинтерпретации memcpy, да даже и приведение типа указателей к другому типу, ничем не менее безопасно чем union-ы. А memcpy ещё и затратно по времени и памяти.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов.
Пример где, как раз, начальные последовательности разные.

И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных.

Согласен что использование union опасно, увеличивает вероятность ошибки. Но альтернативы - reinterpret_cast, сырые указатели, ни чем не лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.11.2024, 22:04
Помогаю со студенческими работами здесь

Не так работает Union
Есть функция Union которая вычисляет объединение двух множеств. Значение функции представляет собой список всех выражений, являющихся...

Не работает UNION в SQLite
Добрый день. Есть два стула работающих по отдельности SQL-запроса на выборку: SELECT * FROM t WHERE password='ANY4FvM9n25AsrU262L6' ...

два и более struct в union неправильно работает
#include "stdafx.h" #include<iostream> #include<string.h> using namespace std; struct Matematika { char imya; char...

НЕ работает Union с присоединенными через ODBC dbf-ми
Что за фигня с присоединенными через ODBC foxpro26 DBF таблицами: SELECT * FROM T1 UNION ALL SELECT * FROM T2 Говорит ODBC -...

Как обращаться к Union
Создал указатель на структуру Person в 19 строчке. Как обратиться к полю Union'a? Некорректное обращение к union в 30, 34, 38, 49, 56,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru