Ответы пользователя по тегу C++
  • Влияние наличия конструктора на расположение элементов внутри класса?

    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 комментарий
  • Как лучше передать Callback в объект?

    mejedi
    @mejedi
    Третий вариант сейчас уже реализованный — передача функтора, содержащего указатель на объект и указатель на фунцию класса.

    Нормальный вариант.
    Ответ написан
  • Почему Линус не любит C++?

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

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

    mejedi
    @mejedi
    Ну так посмотрите, что шлет программа.
    Посмотрите вот-это на всякий случай en.wikipedia.org/wiki/Base64#Variants_summary_table
    Ответ написан
  • Отладка so-библиотеки, загружаемой посредством dlopen()?

    mejedi
    @mejedi
    Проверьте непосредственно в gdb, чтобы исключить проблемы со стороны IDE.
    Ответ написан
    1 комментарий
  • Разработка Unix-приложений?

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

    mejedi
    @mejedi
    Qt и дебилдер в топку. Намного академичнее было бы разобраться с display postscript или x-window.
    Ответ написан
    1 комментарий
  • Epoll ESTABLISHED соединения на сервере?

    mejedi
    @mejedi
    С точки зрения сервера, такие соединения ничем не отличаются от «нормальных». Любое соединение начинает в состоянии ESTABLISHED (игнорируем предшествующие состояния, которые относятся к установлению соединения). Состояние соединения на сервере меняется либо когда из сети приходят какие-то пакеты, либо когда сервер что-то делает с сокетом. В данном случае с клиентской машины не приходит ничего, поэтому состояние не меняется. Если сервер попытается что-то в такое соединение записать, по прошествии положенного таймаута соединение закроется с ошибкой no route to host.

    Клиент может установить соединение и оставить его «висеть» неопределенное время, выглядеть это будет так-же. Решается это введением таймаута, по истечении которого соединение закрывается при отсутствии активности.
    Ответ написан
    Комментировать