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

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Объекты в C++ имеют постоянный размер, известный на этапе компиляции и равный sizeof(экземпляр)

    Утверждение:
    объект класса может содержать и вектор ... а значит разные элементы массива(объекты класса) могут занимать разное количество байт в памяти.

    неверно, так как вектор хранит свои данные не в своем экземпляре, а туда, куда их засунет аллокатор (обычно засовывает на кучу).

    Утверждение:
    [объект класса] и шаблонным может быть ... а значит разные элементы массива(объекты класса) могут занимать разное количество байт в памяти.

    неверно, так как все шаблоны конкретизируются на этапе компиляции.

    Следовательно, объекты класса сидят в массиве друг за дружкой, имеют фиксированный размер, и по ним можно ползать указателем, сдвигая его на этот размер.
    Ответ написан
    Комментировать
  • Как работает эта рекурсия?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Потому что при конкретизации шаблона foo(89.8, a, 234.2,3,'a',0) у вас происходят последовательно
    foo(a, 234.2,3,'a',0)
    foo(234.2,3,'a',0)
    foo(3,'a',0)
    foo('a',0)
    foo(0)

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

    Последний вызов приходится на функцию, которая ничего не печатает, поэтому последний параметр у вас и не печатается.
    Ответ написан
    Комментировать
  • Разное адресное пространство для дочернего и родительского процесса (fork, mmap)?

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    Это особая, коровья магия (CoW, Copy On Write)

    fork просто метит страницы родителя как CoW и немедленно запускает потомка. Реальное копирование произойдет только если потомок будет что-то туда писать.

    Второй вопрос - расшаренная память принадлежит уже индивидуально двум процессам, так что если один закрыл дескриптор, второму на это плевать.
    Ответ написан
    5 комментариев
  • Что происходит с памятью?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Тут происходит старая-старая песня группы Мумий-Тролль - Утекай.
    Ответ написан
    Комментировать
  • Как вызвать функцию в зависимости от полученного числа, без использования условных операторов?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Засунуть адреса функций в массив, выбирать функцию по индексу.

    С синтаксисом предлагаю разобраться самостоятельно.
    Ответ написан
    4 комментария
  • Как перегрузить оператор и не вызвать ненависть коллег?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    1) В данном случае, идея хорошая, так как семантика поломана не будет, но при условии, что
    2) В случае несовпадения валют вы будете бросать исключение.

    Пояснение: Если вы будете возвращать не валюту, (nullptr, false, не важно), вы сломаете семантику сложения, а это делать не следует. Так что ошибку надо обрабатывать в исключении.

    Проблема: Если возникновение таких исключений будет частым (например, это часть бизнес-логики), у вас получится чуть более тормозная программа. В таком случае, лучше отказаться от перегрузки оператора и написать обычный метод.

    Если же валюта вам известна уже на этапе компиляции, переделайте ваш класс в шаблон и делайте все проверки уже на этапе компиляции - это наилучший вариант.
    Ответ написан
    5 комментариев
  • Есть ли механизм работы с сокетами в C++?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Нет. ни в том, ни в другом языке нет ничего для работы с сокетами, все это по отношению к языку - внешние библиотеки.

    Для C++ может быть удобна Boost или Qt
    Ответ написан
    5 комментариев
  • Где то слышал что префиксный инкремент работает быстрее чем постфиксный. Это так?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Все уже изучено

    Коротко - используйте везде префиксный, тогда отладочный код будет работать чуточку (или даже существенно) быстрее, а сам код будет выглядеть крепко, основательно - как будто сениор писал.
    Ответ написан
    Комментировать
  • В чем проблема?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    p[size + size] = 7

    Запись за границу массива - это Неопределенное поведение, которое в данном случае выражается в краше программы.
    Ответ написан
    1 комментарий
  • Почему Boost.Context не находит lib файл?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Потому что буст не весь наглухо шаблонный, есть откомпилированные либы, которые надо явно линковать. Как конкретно линковать - зависит от конкретной системы сборки.
    Ответ написан
    3 комментария
  • Как решить ошибку нарушение прав доступа при чтении по адресу?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Ну гарантированный улет за границу массива вот тут i < zoo.size() + 1
    Что тут делает +1?
    Ответ написан
    Комментировать
  • Почему в C++ всё именно так?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Ответы на ваши вопросы в основном можно отрыть в стандарте языка, или путем нескольких месяцев практического решения задач, без этого моя болтовня вам понимания не добавит.

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

    1) Какая ошибка? Почему любители задавать вопросы по C++ думают, что у каждого программиста в голове компилятор?
    2) Нет, у примитивных типов нет конструкторов и методов
    3) Если коротко, так как int - примитивный тип, у вас все случаи в итоге выражают одно и тоже - объявление и определение одновременно с инициализацией.
    4) Наверное, вы уже поняли, что использовать везде int - плохая возможность для иллюстрации.
    5) void* - это какой-то адрес в памяти. Так как C++ работает в том числе и низкоуровневыми данными, это задача программиста верно интерпретировать то, что находится в памяти по этому адресу. Огромное количество системных функций из POSIX или WINAPI, или OpenGL будут возвращать вам такой указатель.

    6) Потому что они ведут себя разным образом. k = 8; p = 8; a = 13; k+=++a; a=13; p+=a++; /*k=22; p=21*/;
    Поэтому нужны оба.

    7)Потому что так написано в стандарте - sizeof пустой фигни = sizeof(char)
    8) std всегда с вами.
    9) как реализовали разработчики компилятора
    10) как реализовали разработчики компилятора
    Ответ написан
  • Как привязать текстуру к определенному VAO?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Важно понимать, что во времена шейдеров и мегатекстур, все это стало условностями.
    Текстура - это просто большущий растр, на котором могут хранится "текстуры" хоть от всех объектов сцены - вопрос в координатах.

    glBindTexture() // выбрать текстуру
    glActiveTexture(GL_TEXTURE0) //прицепить ее в текстурный модуль

    glBindTexture() // выбрать еще текстуру
    glActiveTexture(GL_TEXTURE1) //прицепить ее в другой текстурный модуль

    В шейдере создаете два семплера.
    sampler2D a;
    sampler2D b;
    В семплеры грузите номера текстурных модулей:
    glUniform1i( id_a, 0);
    glUniform1i( id_a, 1);
    Ответ написан
    2 комментария
  • Почему имена некоторых библиотек заканчивается на .h а некоторые без?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    По классике идея была такой - то, что является частью C++, идет без .h

    (iostream, map, vector, etc)

    Но тут пришел Qt и другие, и решили смешать карты, наделав файлики-прокладки без расширения, которые ведут на файлы с расширением.
    Ответ написан
    Комментировать
  • Что означает такая сигнатура функции?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Это какие-то макросы. В нормальных IDE можно ткнуть в непонятное и сделать Go To Definition и посмотреть, что это такое.

    Такие макросы обычно появляются у всяких кроссплатформенных штуковин с динамической линковкой - когда нужно учесть особенности разных компиляторов и ОС.
    Ответ написан
    Комментировать
  • Как после всех максимальных элементов вставить новый элемент в очереди c++?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    У меня только два вопроса к гениям пидагогики, которые запрещают использовать стандартную библиотеку:

    1) Как они видят будущее своих учеников, если 99.99999% современных программистов только и делают, что комбинируют свои решения из библиотек.

    2) Где логика автора задания, который хочет В СЕРЕДИНУ контейнера, у которого по определению доступ только с КОНЦОВ что-то вставить? И как он хочет искать максимум?

    Выгнать всю очередь в другую очередь, по ходу найти максимум, потом опять выгнать очередь в другую очередь, добавив новые элементы?

    Так если приходится делать такую ерунду, значит, контейнер "очередь" явно и очевидно не подходит для данной задачи.
    Ответ написан
    8 комментариев
  • Как правильно остановить программу?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Для того, чтобы посмотреть вывод программы, ее вовсе не надо останавливать - достаточно настроить IDE так, чтобы она не закрывала терминал после завершения программы.

    Если сильно хочется, можно использовать вот такой код:
    #include <ios>      // Required for streamsize
    #include <iostream>
    #include <istream>
    #include <limits>   // Required for numeric_limits
    
    void myflush ( std::istream& in )
    {
      in.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); // опустошаем все что есть в буфере
      in.clear();
    }
    
    void mypause() 
    { 
      std::cout<<"Press [Enter] to continue . . ."; // собственно, пауза
      std::cin.get();
    }

    Источник
    Использование же system("pause") - костыль, к использованию не годится никогда.
    Ответ написан
    Комментировать
  • Можно ли объявить и реализовать шаблонный метод класса в исходном файле в C++?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    В *.cpp можно поместить определение шаблона целиком. Строго говоря, у шаблона нет реализации - она появляется в тот момент, когда шаблон конкретизируется.

    При этом важно понимать, что в таком случае, вы нигде кроме этого *.cpp шаблоном воспользоваться не сможете - получите ругань линковщика на повторы.

    Именно из первого и второго следует, что место шаблонам - целиком в .h или .hpp (что более правильно). А методичка, где шаблон запихали в *.cpp имеет низкое качество и годится для растопки печки-буржуйки.
    Ответ написан
    5 комментариев
  • Как узнать что функция вернула double число?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    C++ - строго типизированный язык. Функция, задекларированная как double, всегда вернет double.

    Чтобы на ваш вопрос можно было нормально ответить, ознакомьтесь с тем, что такое Проблема X-Y
    Ответ написан
    Комментировать