Здравствуйте, 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])
BFE>>>Дурное дело не хитрое, тем более hack с UB.
L>>И где же здесь UB?
BFE>C draft n1124 BFE> :xz:
Не то цитируешь. В этом же документе n1124 написано как реализовать struct hack без UB. Пример приведён после пункта с описанием flexible array member.
Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту.
Здравствуйте, 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 не поможет?
W>>Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту. BFE>placement new не поможет?
Сохранить точно такой же синтаксис при использовании, как я понимаю, не получится. Но идейно схожую реализацию на C++ написать, конечно, можно.
Просто придётся, например, заменить
instance.array[i]
на
instance.array()[i]
или что-то подобное, скрыв внутри метода операции с указателями. Ну и размечая через placement new память в отдельности для структуры-без-массива и, собственно, элементов самого массива.
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Lazin, Вы писали:
L>>Да хрен с ними, с окошечками. Логирование в буст добавили уже?
X>google -> 'boost logging'
Ну надо же, добавили, в 1.54. Ждем http сервер в 1.65 и драйвер БД в 1.87.
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Lazin, Вы писали:
L>>Google — struct hack X>по рукам бы надавал за такое.
X>можно увидеть хоть какое-то обоснование этому рукоблудству? из реальной задачи, пожалуйста.
В последний раз мне это понадобилось когда у меня было хранилище данных с страничной организацией и страницы содержали массив индексов переменной длины. Что-то вроде этого:
Здравствуйте, watchmaker, Вы писали:
W>Сохранить точно такой же синтаксис при использовании, как я понимаю, не получится. Но идейно схожую реализацию на C++ написать, конечно, можно. W>Просто придётся, например, заменить
instance.array[i]
на
instance.array()[i]
или что-то подобное, скрыв внутри метода операции с указателями. Ну и размечая через placement new память в отдельности для структуры-без-массива и, собственно, элементов самого массива.
Дело в том, что этот прием поддерживается всеми основными с++ компиляторами. Куча кода зависит от этого. Так что это формальный UB, как правильно сказали выше
Сделать более читабельно без UB — нельзя. Сделать по другому в принципе можно, но это сложно. Метод array должен еще выравнивание учитывать, нормально реализовать это до C++11 было нельзя, только через костыли. В С++11 это реализуется относительно нормально, с помощью alignof, но конечно более многословно.
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Lazin, Вы писали:
L>>я вот например иногда использую т.н. structure hack X>APR предоставляет какое-то удобство для этого?
А при чем тут APR? Я привел в пример struct hack просто для того, чтобы показать, что некоторые вещи проще сделать в стиле Си
Здравствуйте, 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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, Lazin, Вы писали:
L>В последний раз мне это понадобилось когда у меня было хранилище данных с страничной организацией и страницы содержали массив индексов переменной длины. Что-то вроде этого:
L>
X>нет, я не боюсь нового, и не ленюсь читать доку. но boost.log — хороший пример того, как из простого можно сделать нечто нереально сложное.
Да я бы не сказал, что там сложно.
Просто... непривычно. По крайней мере, ни у кого из команды не зачесались руки перейти с чрезвычайно комфортного (пусть и слегка тормозного) log4cpp.
Здравствуйте, Lazin, Вы писали:
L>>>Да хрен с ними, с окошечками. Логирование в буст добавили уже?
X>>google -> 'boost logging'
L>Ну надо же, добавили, в 1.54.
X>не уверен что правильно понял, но разве offsets не может быть каким-нить контейнером?
+1 лишняя аллокация и косвенность на страницу...
Ну и +1, или больше указатель соответственно ещё.
В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>+1 лишняя аллокация и косвенность на страницу... E>Ну и +1, или больше указатель соответственно ещё.
ну это-то понятно.
E>В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...
если учесть, что "это" используется для хранилища данных — предположу что для харда — то основной тормоз тут не аллокации и не указатели — а тот самый хард. тогда какой смысл в таких оптимизациях?
к тому же, думается мне, сам offsets может быть указателем, указывающим либо на участок какой-то глобальной таблицы offset`ов, либо указателем на конкретный буфер offset`ов, выдаваемый пулом буферов.
в общем — не вижу смысла в таком хаке.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>... предположу что для харда ...
в смысле, данные либо считываются с харда, либо записываются на него. либо — и то и другое.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
E>>В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед... X>если учесть, что "это" используется для хранилища данных — предположу что для харда — то основной тормоз тут не аллокации и не указатели — а тот самый хард. тогда какой смысл в таких оптимизациях?
Такой, что для харда возможность отмапировать тупо файл на память и юзать как хранилище -- ценна, как нигде.
Ну и потом чем компактнее и локальнее лежат данные, тем быстрее будет же...
X>в общем — не вижу смысла в таком хаке.
Зря.
Кроме того, его же можно безопасно завернуть в С++ шаблон...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Такой, что для харда возможность отмапировать тупо файл на память и юзать как хранилище -- ценна, как нигде.
нее..наверное со мной действительно что-то не так...
а почему не просто сериализовать эту структуру с контейнером, и потом получившееся дописывать в представление?
E>Кроме того, его же можно безопасно завернуть в С++ шаблон...
Lazin это просил.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)