LINUX.ORG.RU
ФорумTalks

OpenSource - действительно ли он такой свободный, как об этом говорят гнушники?

 , ,


1

2

Эта мысль пришла сегодя в голову на работе, когда при исследовании сброшеной корки пришлось заглянуть в исходники гнутого basic_string.

Там же лютый ад (/usr/include/c++/6/bits/basic_string.h):

...
    struct _Rep_base
    {
	size_type		_M_length;
	size_type		_M_capacity;
	_Atomic_word		_M_refcount;
    };

    struct _Rep : _Rep_base {
...
    }

    struct _Alloc_hider : _Alloc
    {
	_Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
	: _Alloc(__a), _M_p(__dat) { }

	_CharT* _M_p; // The actual data.
    };
    private:
      // Data Members (private):
      mutable _Alloc_hider	_M_dataplus;

      _CharT*
      _M_data() const _GLIBCXX_NOEXCEPT
      { return  _M_dataplus._M_p; }
...
      _Rep*
      _M_rep() const _GLIBCXX_NOEXCEPT
      { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
...
Видя такой код появляется одна мысль, что гнутые гуру специально пишут так, чтобы не читалось совершенно. (И потенциально прибитый гвоздями к компилятору, т.к. такая адрессная арифметкиа в структуре может вылезти боком.

Тут можно прямо конкурс устраивать: кто объяснит, суть

return &((reinterpret_cast<_Rep*> (_M_data()))[-1]);

Я для сравнения заглянул в libc++ имплементацию строк, там же все куда адекватнее.

★★★★★

Последнее исправление: invy (всего исправлений: 2)

Тут можно прямо конкурс устраивать: кто объяснит, суть
return &((reinterpret_cast<_Rep*> (_M_data()))[-1]);

А что объяснять? Выделен один кусок памяти под _Rep (служебная структура) и сами данные. Сначала хранится структура, потом данные. А указатель хранится не на начало куска, а на начало данных. Так понятнее?

Насколько могу судить, здесь всё корректно.

intelfx ★★★★★
()

OpenSource - действительно ли он такой свободный

«Open source», свобода и качество кода — три разных вещи.

intelfx ★★★★★
()

кто объяснит, суть

Вроде это делали, чтобы можно было не s.c_str() использовать, а прямо s. Возможно, чтобы какой-нибудь древний глючный софт работал.

i-rinat ★★★★★
()

Нижние подчеркивания изнасиловали мои глаза. Что это было? Только не говорите, пожалуйста, что это штатный синтаксис языка.

Jayrome ★★★★★
()
Ответ на: комментарий от Jayrome

Это префикс зарезервированный для частей компилятора, чтобы не пересекаться с кодом пользователя.

xaizek ★★★★★
()
Ответ на: комментарий от intelfx

Та мне-то понятно. Просто прозреваю от того, зачем так писать?

invy ★★★★★
() автор топика

Видя такой код появляется одна мысль, что гнутые гуру специально пишут так, чтобы не читалось совершенно. (И потенциально прибитый гвоздями к компилятору, т.к. такая адрессная арифметкиа в структуре может вылезти боком.

По себе не надо судить.

Я для сравнения заглянул в libc++ имплементацию строк, там же все куда адекватнее.

Их код намного моложе и никогда не имел той же COW оптимизации как в GCC. Они любят класть на совместимость, так что меньше макросов.

А судя по процитированному, ТС не знает, что такое empty base optimization и в целом не понимает, что тут главное малый размер объекта, а не читабельность.

xaizek ★★★★★
()

гнушники НЕ говорят OpenSource

buratino ★★★★★
()
Ответ на: комментарий от derlafff

libc++ читабельнее написан.

invy ★★★★★
() автор топика
Ответ на: комментарий от xaizek

По себе не надо судить.

Ты хочешь сказать что оно читабельно сразу? Без вникания что вообще происходит в классе вцелом?

А судя по процитированному, ТС не знает, что такое empty base optimization и в целом не понимает, что тут главное малый размер объекта, а не читабельность.

И при чем [-1] к empty base optimization?

invy ★★★★★
() автор топика

Плюсовикам тут всё понятно, а для гуманитариев есть python.

Lavos ★★★★★
()

Тут можно прямо конкурс устраивать: кто объяснит, суть

Так очень удобно и просто делать заголовки к каким-нибудь строкам и прочим массивам/структурам, которые хочется скармливать функциям, понимающим только просто массив/структуру без всяких там заголовков. А если вдруг понадобится заголовок, то нужно просто вычесть его размер из адреса массива/структуры. Что собственно и делается - кастуем указатель на массив/структуру в указатель на заголовок и вычитаем единицу. Можно просто написать что-то типа ((char*)data_addr - sizeof(struct header)), но чтобы не пугать обывателя ужасной адресной арифметикой в явном виде, можно написать и &(((struct header *)data_addr)[-1]). Так, наверно, даже красивше и немного короче будет.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)

Идентификаторы, начинающиеся с двух нижних подчёркиваний или одного и заглавной буквы — зарезервированные для стандартной библиотеки и компилятора стандартом.

utf8nowhere ★★★
()


Видя такой код появляется одна мысль, что гнутые гуру специально пишут так, чтобы не читалось совершенно. (И потенциально прибитый гвоздями к компилятору, т.к. такая адрессная арифметкиа в структуре может вылезти боком.


А ты думаешь MS пишет более понятный код без прибивания гвоздями к своему компилятору?

m0rph ★★★★★
()
Ответ на: комментарий от Jayrome

Нижние подчеркивания изнасиловали мои глаза.

Будьте добры, покажите мне верхние и средние подчёркивания.

alex-w ★★★★★
()
Ответ на: комментарий от utf8nowhere

Что ты не знаешь русского языка.

Что такое «нижнее подчеркивание» в твоём понимании, о гуру русского языка?

alex-w ★★★★★
()
Ответ на: комментарий от invy

Ты хочешь сказать что оно читабельно сразу? Без вникания что вообще происходит в классе вцелом?

Нет, как я уже сказал, тут не читабельность главное, а эффективность и совместимость. Оно не от балды так сделано. Может даже в одном из руководств описаны причины.

И при чем [-1] к empty base optimization?

К этому не при чём, оно относится к странному наследованию. [-1] это видимо, для сохранения ABI с версией без COW.

xaizek ★★★★★
()
Ответ на: комментарий от fornlr

The GPL is not focused on freedom.

Как раз наоборот. Только речь в ней идёт не о свободах производителя, а о свободах потребителя и свободе самого кода.

xaizek ★★★★★
()

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

и да, если та можешь написать так, чтобы это работало так же быстро, на тех же платформах, и чтобы код выглядел «более лучше», то никто не мешает тебе постить свои патчи в общий котёл.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)

Там же лютый ад

Нет, это просто cpp.

Видя такой код появляется одна мысль, что гнутые гуру специально пишут так, чтобы не читалось совершенно.

Нет, это просто cpp.

И потенциально прибитый гвоздями к компилятору, т.к. такая адрессная арифметкиа в структуре может вылезти боком.

Нет, это просто cpp.

Deleted
()
Ответ на: комментарий от uin

«Вначале добейся стабильной работы, потом оптимизируй»

Похоже на отговорку Microsoft, чтобы не делать ни того, ни другого.

Jayrome ★★★★★
()

Не надо недостаток своей квалификации сваливать на других, ок? Люди писали, они понимали как это работает. Научись мириться с тем, что понимать других людей это тяжёлый труд и этому надо учиться. Такая херня в любом крупном проекте. Свой стиль, своя специфика. Если нет какого-то лютого стиля, то обязательно есть другие подводные камни вроде прибитости к каким-то средствам разработки, которые работают только в определённых конфигурациях и тд. И это естественно, потому что люди работают и их всё устраивает, тестировать и объять не объятное они не могут впринципе.

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

ixrws ★★★
()
Ответ на: комментарий от Jayrome

«Вначале добейся стабильной работы, потом оптимизируй»

Похоже на отговорку Microsoft

Make it work, make it right, make it fast. Это фольклор, который старше Microsoft.

tailgunner ★★★★★
()
Ответ на: комментарий от Jayrome

Это GNU подход и он в целом верный.
Майкрософт тут вообще не к месту приплетен, так как это не открытое комьюнити а корпорация предлагающая программные продукты только для конечного использования и в основном исключительно для своей программной платформы, какая нам разница какой у них код?

uin ★★★
()
Ответ на: комментарий от xaizek

К этому не при чём, оно относится к странному наследованию. [-1] это видимо, для сохранения ABI с версией без COW.

Так к остальному у меня претензий и не было, я его привел для того чтобы было ясно что делает [-1].

invy ★★★★★
() автор топика

Это не лютый ад, а самый что ни на есть обычный код на плюсах, заточенный на производительность и написанный до появления всяких новомодных стандартов.

peregrine ★★★★★
()
Ответ на: комментарий от Iron_Bug

ты пришёл, открыл произвольный сорц и сразу достиг просветления?

Когда открываешь хороший сорц, сразу видно что происходит в этом месте. А тут пришлось таки вникать, что за хрень делает код.

и да, если та можешь написать так

Есть libc++, не знаю насколько он быстр, но подозреваю, что весьма неплох.

invy ★★★★★
() автор топика
Ответ на: комментарий от m0rph

А ты думаешь MS пишет более понятный код

Не помню и не знаю уже. Я в их stl уже много лет не заглядывал.

invy ★★★★★
() автор топика
Ответ на: комментарий от peregrine

не самый обычный. для написания такого кода нужны весомые аргументы.

      { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }

invy ★★★★★
() автор топика
Ответ на: комментарий от uin

Это GNU подход

И в целом он верный, только, если не писать качественно сразу, все остается лишь в теории.

Jayrome ★★★★★
()
Ответ на: комментарий от Jayrome

если не писать качественно сразу

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

uin ★★★
()

Проггеры на сях и плюсах часто скатываются в написание кода для машины, а не для человека. Тут мы наблюдаем именно такой случай.

Xintrea ★★★★★
()

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

te111011010
()
Ответ на: комментарий от uin

Тебе осталось начать писать на яваскрипте в одну строку, чтоб парсинг быстрее шел, и не тратить машинные ресурсы на сокращатели кода. На разработчиков плевать.

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Не, ну я то имею в виду такие вещи как например

function (ms) {
var s, m, h;
    s = Math.floor(ms) % 60;
    m = Math.floor(ms / 60) % 60;
    h = Math.floor(ms / (60 * 60));

   return {
       seconds: s,
       minutes: m,
       hours  : h
   }
}

А еще совсем недавно это же вычисление выглядело у меня вот так:
var x = Math.floor(ms),
    s = x % 60, h = 0,
    m = Math.floor(x / 60);
if (m > 59) {
    h = Math.floor(m / 60);
    m %= 60;
}


Поясню свое мышление: раньше я исходил из простой логики - чем меньше делать каких то действий тем лучше. Избегал дублирования действий, то есть до этого что то вычисляю кидаю в переменную и потом дальше этот результат использую. Через проверку условия реализовано потому что там где используется этот код, часы очень редкое явление, вычислять их каждый раз ни к чему.
Но потом я насмотрелся видео, начитался афигительных статей, узнал про зависиомость по данным, ветвления, а один раз написал вместо обычного цикла функции которые друг друга вызывали в цикличном порядке и узнал про такую штуку как call stack и что его можно переполнить.

Но вообще я конечно тесты вначале пишу что бы прповерить есть ли какой то эффект и не в худшую ли он сторону, хотя JIT конечно может творить с кодом (даже с неоптимальным) волшебные вещи, что неоптимальный код после двух трех запусков уже и не проигрывает.

uin ★★★
()
Последнее исправление: uin (всего исправлений: 1)
Ответ на: комментарий от fornlr

То есть ты не различаешь подчёркивания, надчёркивания и зачёркивания. Фраза «нижнее подчёркивание» по смыслу примерно равна фразе «яйцеобразное яйцо».

alex-w ★★★★★
()

На мой взгляд,

return reinterpret_cast<_Rep*>(_M_data()) - 1
было бы куда понятнее. В остальном --- стандартная практика к строкам C пристраивать заголовок, как уже заметили выше.

Jini ★★
()
Ответ на: комментарий от Solace

я в курсе. иначе он был бы вообще летально тормозной :) и так у него с производительностью стрёмно, даже когда он почти ничего не делает, только дёргает сишные вызовы.

Iron_Bug ★★★★★
()
Ответ на: комментарий от wieker

при чём тут шаблоны? я про них ни слова не говорила.

Iron_Bug ★★★★★
()

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

NextGenenration ★★
()
Ответ на: комментарий от invy

для написания такого кода нужны весомые аргументы

Загляни в libc, найди исходники malloc и увидишь почти то же самое. А еще можешь в boost заглянуть - это вообще полный п..ц.

kawaii_neko ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.