@ProCxx

Страница 2408 из 2477
Andrew
05.10.2018
06:48:23
#pragma pack() тадам
Во, я думал, предложит ли кто-то это говно. Теперь по всему коду будет хуже работа со структурой, но можно бездумно делать memcpy, каааайф.

Pepe
05.10.2018
06:49:40
Во, я думал, предложит ли кто-то это говно. Теперь по всему коду будет хуже работа со структурой, но можно бездумно делать memcpy, каааайф.
я ожидал реакции. Я это не юзал, но помню что что-то из макрософта, плюс прагма есть, значит должно возбуждать ненависть)

Google
Vladislav
05.10.2018
07:01:32
Rabu
05.10.2018
07:25:40
__attribute__((aligned32))

Vladislav
05.10.2018
07:26:34
а какое оно имеет отношение к паддингу?

Rabu
05.10.2018
07:27:01
так align жеж

Aidar
05.10.2018
07:27:17
так align жеж
Слова то разные

Побитый
05.10.2018
07:32:28
И даже с POD, потому что вы работаете с неинициализированной памятью.
Что в таком случае значит "инициализированная" память?

Andrew
05.10.2018
07:33:55
Что в таком случае значит "инициализированная" память?
Память выделенная, но в которую не была произведена никакая запись, в данном случае из нее читают.

Это было, правда, про неинициализированную.

Побитый
05.10.2018
07:35:01
Память выделенная, но в которую не была произведена никакая запись, в данном случае из нее читают.
И по твоему запись в такую память это ub? А как её проинициализировать не производя запись?

Andrew
05.10.2018
07:35:50
И по твоему запись в такую память это ub? А как её проинициализировать не производя запись?
Не запись, а чтение. В padding'е лежит мусор, ты его при memcpy читаешь наравне с данными структуры.

Google
Побитый
05.10.2018
07:36:30
А, понял теперь. Просто с первого раза какой-то парадокс показался)

Pepe
05.10.2018
08:02:24
Память выделенная, но в которую не была произведена никакая запись, в данном случае из нее читают.
секунду, а как вообще кто нибудь, компилятор или хардвар знает что память неинициализирована если она выделена?

Andrew
05.10.2018
08:04:31
секунду, а как вообще кто нибудь, компилятор или хардвар знает что память неинициализирована если она выделена?
Да. Пару дней назад был человек, у которого в бенчмарке использовался неинициализированный массив, после инициализации компилятор начал по-другому с ним работать.

Pepe
05.10.2018
08:06:56
Да. Пару дней назад был человек, у которого в бенчмарке использовался неинициализированный массив, после инициализации компилятор начал по-другому с ним работать.
да, но как? То есть это какая то опциональная фича компилятора может отследить (в отдельных случаях), но там было про УБ и т.п.

Andrew
05.10.2018
08:09:35
Ну, если ты выделил локальный массив и сразу из него читаешь, то все немного очевидно. В случае с паддингом, на самом деле, тоже можно отслеживать, при желании. Да и вообще, кажется, при компиляции достаточно иметь пометку, что в память пока никто не писал, и на нее орентироваться.

Andrew
05.10.2018
08:21:07
Зависит от компилятора? Через 10 лет еще поумнеют, и твой код станет валиться из-за УБ. Не надо так.

yuri
05.10.2018
08:32:41
секунду, а как вообще кто нибудь, компилятор или хардвар знает что память неинициализирована если она выделена?
Это уже вопрос к ядру операционной системы. Память может быть выделена, но при этом не существовать физически. Когда ее инициализируешь, то только тогда память появляется в адресном пространстве.

Zorro
05.10.2018
08:37:42
Да. Пару дней назад был человек, у которого в бенчмарке использовался неинициализированный массив, после инициализации компилятор начал по-другому с ним работать.
После какой инициализации? Не было такого факта. Этот человек - я. Иллюстрация невнимательного чтения и виденья только желаемого.

Basil
05.10.2018
09:08:25
Во, я думал, предложит ли кто-то это говно. Теперь по всему коду будет хуже работа со структурой, но можно бездумно делать memcpy, каааайф.
Ну, вообще-то, можно указать область действия этой прагмы. и это нормальный подход. А говном становится многое, если им пользоваться не включая голову.

Andrew
05.10.2018
09:10:39
Ну, вообще-то, можно указать область действия этой прагмы. и это нормальный подход. А говном становится многое, если им пользоваться не включая голову.
На самом деле, тут начинается скорее вкусовщина, но для меня обоснование "не хочу руками писать read/write" для действия "навернуть отключающую оптимизицию компиляторозависимую прагмину" является скорее оправданием лени.

Basil
05.10.2018
09:17:18
не всегда лень. просто не везде памяти 100500Мб. при 8к ОЗУ и не так раскорячишься.

Andrew
05.10.2018
09:25:13
А, не, ну это совсем другая история.

Constantine
05.10.2018
09:55:40
я, кажется, даже слышал где-то этот фокус с полной выгрузкой всей памяти и последующим изучением PageFault, но не помню, где

Ilia
05.10.2018
10:15:49
Память выделенная, но в которую не была произведена никакая запись, в данном случае из нее читают.
Тут не страшно это совсем, потому что эту непроинициализированную память ты потом не будешь использовать.

Andrew
05.10.2018
10:16:44
Тут не страшно это совсем, потому что эту непроинициализированную память ты потом не будешь использовать.
Но ты ее используешь с точки зрения компилятора: ты ее прочел и результат куда-то записал.

Google
Andrew
05.10.2018
10:17:47
Но ты его не испльзуешь в программе никак
Компилятор видит memcpy, он не вкурсе, что там дальше будет. Я не уверен, что он будет париться, хороший ли у тебя uninitialized read или плохой.

Ilia
05.10.2018
10:22:11
Компилятор видит memcpy, он не вкурсе, что там дальше будет. Я не уверен, что он будет париться, хороший ли у тебя uninitialized read или плохой.
Пагади, ты что -то запутался... Шаг 0) мы объявляем структуру в какой -то памяти. Там есть паддинги. Мы их не ипользуем. Шаг 1) Мы заполняем нужные мемберы нужными данными . Паддинги не используются. Шаг 2) мы записываем бинарный образ структуры на диск. Паддинги записываются. Шаг 3) В новом экземпляре программы мы создаём новый экземпляр структуры. Шаг 4) Читаем бинарный образ структуры с диска. Члены читаются, заполняются. Паддинги тоже заполняются. Шаг 5) идёт нормальная работа программы. Члены структуры с соотв. данными используются, Паддинги не используются. В чём проблема?

Andrew
05.10.2018
10:23:13
в шаге 2 ты читаешь паддинги, я утверждаю, что это uninitialized read

Ilia
05.10.2018
10:23:46
в шаге 2 ты читаешь паддинги, я утверждаю, что это uninitialized read
Ты их потом не испльзуешь в программе, поведение программы не зависит от них.

Andrew
05.10.2018
10:24:14
И что? Если я не использую результат UB, он перестает быть UB? Это не так работает.

Ilia
05.10.2018
10:25:24
в шаге 2 ты читаешь паддинги, я утверждаю, что это uninitialized read
Давай аналог: Ты выделил через malloc буфер в 1к байт и по условиям его используешь, инициализируешь и потом используешь (чтение и запись), но если условие не соблюдается, то он в программе не используется и так неинициализированным и освобождается. Тут есть UB?

Andrew
05.10.2018
10:26:02
Если существует ветвь выполнения, при которой я прочту непроинициализированную память, то да.

Andrew
05.10.2018
10:27:53
Из твоего описания это неочевидно. Если указанное мной условие невыполняется, то УБ нет. И?

Ilia
05.10.2018
10:28:21
Из твоего описания это неочевидно. Если указанное мной условие невыполняется, то УБ нет. И?
но если условие не соблюдается, то он в программе не используется и так неинициализированным и

Andrew
05.10.2018
10:28:55
Нет же, mem(cpy/set/cmp) дойдет и до паддингов.

Ilia
05.10.2018
10:29:22
Дмитрий
05.10.2018
10:29:32
Какая к черту разница что ты делаешь с неинициализированным массивов байтиков

Куда копируешь твоё дело

Читать неинициализированное число не UB

Andrew
05.10.2018
10:30:47
А с какого тут ещё и memcpy?
Ты вообще помнишь, о чем разговор? Человеку посоветовали структуру сохранять в файл через memset на mmap (на самом деле, fwrite(to, &foo, sizeof(foo)) тут не лучше).

Google
Andrew
05.10.2018
10:42:58
Читать неинициализированное число не UB
Его использование это UB, емнип, например int i; std::cout << i; Чем копирование куда-то отличается от печати?

Ilia
05.10.2018
10:45:38
Его использование это UB, емнип, например int i; std::cout << i; Чем копирование куда-то отличается от печати?
Андей, попробуй найти место стандарта, где написано, что это UB. Я вот не уверен в этом совсем. Даже наоборот, уверен, что UB тут нет. А про то, что memcpy неинициализированного это не UB, тебе уже писали.

Ilia
05.10.2018
10:51:42
Чтение неинициализированной переменной UB...
Но паддинг в структуре -- не переменная.

Alexander
05.10.2018
10:52:38
Пример не очень. У вас в зависимости что где эта переменная она будет или нет инициализирована неявно. При этом есть напирающие на UB

Constantine
05.10.2018
10:53:09
Но паддинг в структуре -- не переменная.
Области паддинга в структуре читать вообще нельзя... А вот memcpy видимо их можно (но это должна быть отдельная гарантия)

А, наверное, их можно читать только в байтовом представлении. Сложно.

Antony
05.10.2018
10:55:10
Андей, попробуй найти место стандарта, где написано, что это UB. Я вот не уверен в этом совсем. Даже наоборот, уверен, что UB тут нет. А про то, что memcpy неинициализированного это не UB, тебе уже писали.
Вроде оно: When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced (7.6.18). If an indeterminate value is produced by an evaluation, the behavior is undefined except in the following cases <...>

[dcl.init]

http://eel.is/c++draft/dcl.init#12

Antony
05.10.2018
10:57:07
Внизу прям пример есть

Alex Фэils?︙
05.10.2018
10:57:59
А мемсру просто тупо копирует

Antony
05.10.2018
10:58:06
Constantine
05.10.2018
10:58:13
О! Я тут как раз недавно набрасывал как идею, чем может сломаться [] (bool b, auto&& value) -> std::optional { /*auto -> шаблонное имя; все выполнившиеся deduction guide должны вернуть одно и то же, первый выполнившийся дает ответ*/ if (!b) return std::nullopt; /*вроде здесь нет подходящего*/ return std::forward<decltype(value)>(value); /*а вот тут есть*/ }

Ilia
05.10.2018
10:59:26
А как выглядит пример полностью? А то я скорее отвечал на ^
Ну примера нет. Обсуждаем создание в любой памяти структуры с паддингом (выравниванием членов) и последующей её записью на диск через write, затем чтение через read и использование в программе. И потом то же, но с копированием всего это в Mem-mapped область.

Andrew
05.10.2018
10:59:37
А как выглядит пример полностью? А то я скорее отвечал на ^
[In reply to Ilia Zviagin] Ты вообще помнишь, о чем разговор? Человеку посоветовали структуру сохранять в файл через memset на mmap (на самом деле, fwrite(to, &foo, sizeof(foo)) тут не лучше).

Претензия была к паддингам

Google
Aidar
05.10.2018
11:03:46
кусок паддинга эт не то

Andrew
05.10.2018
11:05:02
Согласен.

Страница 2408 из 2477