Задать вопрос
Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (12)

Наибольший вклад в теги

Все теги (48)

Лучшие ответы пользователя

Все ответы (28)
  • Влияние наличия конструктора на расположение элементов внутри класса?

    mejedi
    @mejedi
    Вам знакомо понятие «выравнивание»?

    В зависимости от модели, процессор либо вообще не умеет читать невыравненные данные (ex: попытка чтения четырех байтового слова по адресу, не кратному 4 приводит к аппаратному исключению) либо делает это очень медленно. Атомарные операции также работают только с выравненными данными.

    Таким образом, поле типа long должно быть выравнено на границу 8 байт. Так как объекты могут располагаться в массивах подряд друг за дружкой, размер объекта также должен быть кратен 8. В общем случае — необходима кратность максимальному выравниванию среди полей. В результате получается следующий расклад: 8 байт long, 4 байт int, 4 байт паддинга. Если выравнивание на 8 байт не нужно (отсутствует long поле), то необходимости «подгонять» размер объекта тоже нет, и паддинга не возникает.

    Теперь самое интересное — почему есть эффект от пустого конструктора?

    Снова обратимся к теории. В C++ есть понятие POD типа. Можно сказать, это такая декларация, для которой гарантируется совместимость с Си. Для структур в языке Си непосредственно в стандарте прописаны правила «раскладки» полей в памяти, паддинги и все такое. До тех пор, пока Point не имеет пользовательского конструктора, он является POD, и следовательно должен иметь в конце «неприкосновенный» padding.

    Напротив, для не-POD типов стандарт не фиксирует представление в памяти. Например классы вполне законно представлять хоть хеш-таблицей, именно поэтому в C++ запрещено использование offsetof для полей класса. Поэтому компилятор вполне вправе творчески переиспользовать padding в объете Point для полей Point3D. Замечу, на другом компиляторе вы могли получить другой результат, и это было бы все равно ок с точки зрения языка C++.

    Что любопытно, объявления с ключевым словом class все еще могут быть POD-типами. Классы и структуры перестают быть POD типами наприемр если есть наследование или пользовательские конструкторы или виртуальные функции.
    Ответ написан
    1 комментарий
  • Почему Линус не любит C++?

    mejedi
    @mejedi
    Проблема не в качестве языка, а в качестве программистов.

    Не любят вот почему:
    1) Сферический C++ программист не знает структур данных — за него все делает STL.
    2) Сферический C++ программист беззаботно выделяет память.
    3) Программа сферического C++ программиста не работает без буста.
    4) Сферический C++ программист делает простые вещи сложно.
    Ответ написан
    6 комментариев
  • Задача, прошу review решения

    mejedi
    @mejedi
    Есть недочеты как в части знания и применения идиом C++, так и в скиле системного программирования.

    Базовый класс InterthreadObject — фе. В данном случае правильно использовать агрегацию. Вместо Enter/LeaveCriticalSection использовать класс lock a-la boost scoped_lock. Что на счет копирования/присваивания таких объектов?

    StopperCondition — а зачем там вобще синхронизация? (Здесь соискатель может начинать рассказывать про volatile, барьеры и тд).

    InterthreadRequestQueue перевести на умные указатели или обосновать почему они здесь не нужны. Не использовать new[] для выделения буфера под хэндлы. Сами хэндлы сделать объектом для автоматического закрытия в деструкторе.

    Возможно им не понравился printf. Лично у меня вызывает неприятие getc(cin) в конце main. Возможно, ожидается обработка исключений раз уж GetRequest/StopRequest старательно объявлены как no-throw.

    Consumer thread будет находиться в состоянии активного ожидания при исчерпании очереди. Более того несколько консъюмеров будут мешать друг другу и продьюсеру постоянно борясь за одну критическую секцию. Я бы оснастил очередь condition variable, это бы решило данную проблему.
    Ответ написан
    Комментировать
  • Разработка Unix-приложений?

    mejedi
    @mejedi
    Если хотят unix-программиста, означать это может самое разное. Одно из возможных прочтений — человек, который шарит в системном программировании для *NIX систем. Обязанности могут варьироваться от написания демонов до адаптирования OS проектов под специфические хотелки заказчика (ex: Percona). Как правило, нужно знание POSIX+специфические API конкретных ОС, язык Си или C++, знание инструментов разработки (как минимум gdb не должен пугать).
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (9)