Re[19]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 11:47
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Дурное дело не хитрое, тем более hack с UB.

Ну а если мне нужно? И где же здесь UB?
Re[20]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 12:37
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Google — struct hack

по рукам бы надавал за такое.

можно увидеть хоть какое-то обоснование этому рукоблудству? из реальной задачи, пожалуйста.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[18]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 12:40
Оценка:
Здравствуйте, Lazin, Вы писали:

L>я вот например иногда использую т.н. structure hack

APR предоставляет какое-то удобство для этого?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[20]: Хозяйке на заметку: compile-time CRC32
От: B0FEE664  
Дата: 04.12.13 12:45
Оценка:
Здравствуйте, Lazin, Вы писали:

BFE>>Дурное дело не хитрое, тем более hack с UB.

L>Ну а если мне нужно?
Что конкретно? Задача какая?

L>И где же здесь UB?


C draft n1124

J.2 Undefined behavior

— Addition or subtraction of a pointer into, or just beyond, an array object and an
integer type produces a result that does not point into, or just beyond, the same array
object.
— Addition or subtraction of a pointer into, or just beyond, an array object and an
integer type produces a result that points just beyond the array object and is used as
the operand of a unary * operator that is evaluated

и

— An array subscript is out of range, even if an object is apparently accessible with the
given subscript (as in the lvalue expression a[1][7] given the declaration int
a[4][5])


И каждый день — без права на ошибку...
Re[21]: Хозяйке на заметку: compile-time CRC32
От: watchmaker  
Дата: 04.12.13 13:02
Оценка: 3 (1)
Здравствуйте, B0FEE664, Вы писали:


BFE>>>Дурное дело не хитрое, тем более hack с UB.


L>>И где же здесь UB?


BFE>C draft n1124

BFE> :xz:

Не то цитируешь. В этом же документе n1124 написано как реализовать struct hack без UB. Пример приведён после пункта с описанием flexible array member.
Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту.
Re[22]: Хозяйке на заметку: compile-time CRC32
От: B0FEE664  
Дата: 04.12.13 13:38
Оценка:
Здравствуйте, watchmaker, Вы писали:

BFE>>>>Дурное дело не хитрое, тем более hack с UB.

L>>>И где же здесь UB?
BFE>>C draft n1124
BFE>>
W>Не то цитируешь. В этом же документе n1124 написано как реализовать struct hack без UB. Пример приведён после пункта с описанием flexible array member.

Забавно. Значит узаконили это безобразие.

W>Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту.

placement new не поможет?
И каждый день — без права на ошибку...
Re[23]: Хозяйке на заметку: compile-time CRC32
От: watchmaker  
Дата: 04.12.13 14:25
Оценка:
Здравствуйте, B0FEE664, Вы писали:



W>>Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту.

BFE>placement new не поможет?

Сохранить точно такой же синтаксис при использовании, как я понимаю, не получится. Но идейно схожую реализацию на C++ написать, конечно, можно.
Просто придётся, например, заменить
instance.array[i]
на
instance.array()[i]
или что-то подобное, скрыв внутри метода операции с указателями. Ну и размечая через placement new память в отдельности для структуры-без-массива и, собственно, элементов самого массива.
Re[23]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:00
Оценка: :)
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Lazin, Вы писали:


L>>Да хрен с ними, с окошечками. Логирование в буст добавили уже?


X>google -> 'boost logging'


Ну надо же, добавили, в 1.54. Ждем http сервер в 1.65 и драйвер БД в 1.87.
Re[21]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:03
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Lazin, Вы писали:


L>>Google — struct hack

X>по рукам бы надавал за такое.

X>можно увидеть хоть какое-то обоснование этому рукоблудству? из реальной задачи, пожалуйста.


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

struct Page {
...
Metadata
...
int32_t num_items;
int32_t offsets[];
};
Re[24]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:09
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Сохранить точно такой же синтаксис при использовании, как я понимаю, не получится. Но идейно схожую реализацию на C++ написать, конечно, можно.

W>Просто придётся, например, заменить
instance.array[i]
на
instance.array()[i]
или что-то подобное, скрыв внутри метода операции с указателями. Ну и размечая через placement new память в отдельности для структуры-без-массива и, собственно, элементов самого массива.


Дело в том, что этот прием поддерживается всеми основными с++ компиляторами. Куча кода зависит от этого. Так что это формальный UB, как правильно сказали выше

Сделать более читабельно без UB — нельзя. Сделать по другому в принципе можно, но это сложно. Метод array должен еще выравнивание учитывать, нормально реализовать это до C++11 было нельзя, только через костыли. В С++11 это реализуется относительно нормально, с помощью alignof, но конечно более многословно.
Re[19]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:11
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Lazin, Вы писали:


L>>я вот например иногда использую т.н. structure hack

X>APR предоставляет какое-то удобство для этого?

А при чем тут APR? Я привел в пример struct hack просто для того, чтобы показать, что некоторые вещи проще сделать в стиле Си
Re[24]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 23:18
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Ну надо же, добавили, в 1.54.

а толку-то?
казалось бы, банальная задача — что-то залогировать. но то что реализовали — инопланетные технологии.
нет, я не боюсь нового, и не ленюсь читать доку. но boost.log — хороший пример того, как из простого можно сделать нечто нереально сложное.
до его исходников я все еще не добрался. надеюсь, хоть качество кода нормальное..

L>Ждем http сервер в 1.65

еще в 1.35 добавили. не навороченные, правда — но очень даже рабочие.
http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/examples.html

L>драйвер БД в 1.87.

это, вроде как, лишнее. иначе после этого можно будет ожидать GUI библиотечку...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[22]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 23:21
Оценка:
Здравствуйте, Lazin, Вы писали:

L>В последний раз мне это понадобилось когда у меня было хранилище данных с страничной организацией и страницы содержали массив индексов переменной длины. Что-то вроде этого:


L>
L>struct Page {
L>...
L>Metadata
L>...
L>int32_t num_items;
L>int32_t offsets[];
L>};
L>

не уверен что правильно понял, но разве offsets не может быть каким-нить контейнером?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[25]: Хозяйке на заметку: compile-time CRC32
От: SkyDance Земля  
Дата: 05.12.13 03:29
Оценка:
X>нет, я не боюсь нового, и не ленюсь читать доку. но boost.log — хороший пример того, как из простого можно сделать нечто нереально сложное.

Да я бы не сказал, что там сложно.
Просто... непривычно. По крайней мере, ни у кого из команды не зачесались руки перейти с чрезвычайно комфортного (пусть и слегка тормозного) log4cpp.
Re[24]: Хозяйке на заметку: compile-time CRC32
От: night beast СССР  
Дата: 05.12.13 05:34
Оценка:
Здравствуйте, Lazin, Вы писали:

L>>>Да хрен с ними, с окошечками. Логирование в буст добавили уже?


X>>google -> 'boost logging'


L>Ну надо же, добавили, в 1.54.


лучше бы не добавляли
Re[23]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 05.12.13 07:08
Оценка: +1
Здравствуйте, niXman, Вы писали:


X>не уверен что правильно понял, но разве offsets не может быть каким-нить контейнером?


+1 лишняя аллокация и косвенность на страницу...
Ну и +1, или больше указатель соответственно ещё.

В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[24]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.13 07:23
Оценка:
Здравствуйте, Erop, Вы писали:

E>+1 лишняя аллокация и косвенность на страницу...

E>Ну и +1, или больше указатель соответственно ещё.
ну это-то понятно.

E>В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...

если учесть, что "это" используется для хранилища данных — предположу что для харда — то основной тормоз тут не аллокации и не указатели — а тот самый хард. тогда какой смысл в таких оптимизациях?

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

в общем — не вижу смысла в таком хаке.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[25]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.13 07:28
Оценка:
Здравствуйте, niXman, Вы писали:

X>... предположу что для харда ...

в смысле, данные либо считываются с харда, либо записываются на него. либо — и то и другое.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[25]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 05.12.13 07:44
Оценка:
Здравствуйте, niXman, Вы писали:

E>>В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...

X>если учесть, что "это" используется для хранилища данных — предположу что для харда — то основной тормоз тут не аллокации и не указатели — а тот самый хард. тогда какой смысл в таких оптимизациях?

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

X>в общем — не вижу смысла в таком хаке.

Зря.

Кроме того, его же можно безопасно завернуть в С++ шаблон...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[26]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.13 07:53
Оценка:
Здравствуйте, Erop, Вы писали:

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

нее..наверное со мной действительно что-то не так...

а почему не просто сериализовать эту структуру с контейнером, и потом получившееся дописывать в представление?

E>Кроме того, его же можно безопасно завернуть в С++ шаблон...

Lazin это просил.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.