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)

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

так вот такой код как приведен в начале темы, мне понятен и кажется красивым. Более того - у меня свой подход к изучению, не люблю учить по описанию интерфейсов и что делают ф-ии (вернее этого мало) люблю спускаться в сырцы. По началу конечно был шок, потом пришло полное понимание и наслаждение кодом STL, очень рекомендую кстати новичкам не просто учить контейнеры, а разобрать до строчки каждый контейнер из GNU STL, ответить на вопросы почему именно так написано а не иначе (хотя да, там можно иногда получить ответ «этот код наследие, и в новой версии его не будет, т.к. это дубляж» - да, такое в GCC тоже есть, но мало =) )

и более того сейчас иногда делаю (пытаюсь делать) плагин для Эклипса, там куча интерфейсов, манов к ним, и джава. Так вот это (Эклипс PDE) мне кажутся нечитаемым, некрасивым и сложным, а STL, GNU и даже сырцы G++ и GCC компилятора очень понятными и без манов, все видно в коде, читать приятно. В сырцы компилятора тоже пришлось залести для анализа ф-й метапрограммирования - чтобы понимать которые из них являются так сказать чистыми (не в математическом плане, а в плане возможности реализации на свойствах шаблонов и только) а которые не чистые (я так называл те которые активно используются в метапрограммировании, но при этом реализаовать их, без добавления новых возможостей в компилятор ради самих этих ф-й, используя только его возможности по работе с шаблонами, было бы не возможно)

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