
- Главная
- Каталог
- Интернет технологии
- C/C++ | Вопросы собесов
C/C++ | Вопросы собесов
Разбираем вопросы с собеседований на С/С++ разработчика
Статистика канала
* после типа данных.
int* ptr; // Указатель на целое число
double* dptr; // Указатель на число с плавающей {}
& (адресной операции).
int value = 42;
int* ptr = &value; // ptr хранит адрес переменной {}
Пример использования указателей
#include <iostream>
int main() {
int value = 42;
int* ptr = &value; // ptr хранит адрес переменной value
std::cout << "Значение value: " << value << std::endl; // Вывод: 42
std::cout << "Адрес value: " << &value << std::endl; // Вывод: Адрес переменной value
std::cout << "Значение, на которое указывает ptr: " << *ptr << std::endl; // Вывод: 42
std::cout << "Адрес, хранимый в ptr: " << ptr << std::endl; // Вывод: Адрес переменной value
// Изменение значения через указатель
*ptr = 10;
std::cout << "Новое значение value: " << value << std::endl; // Вывод: 10
return 0;
}{}
*, можно получить или изменить значение, на которое указывает указатель.
int value = 42;
int* ptr = &value;
*ptr = 10; // Изменение значения value через {}
& оператор используется для получения адреса переменной.
* оператор используется для разыменования указателя.
int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr;
std::cout << *(ptr + 1) << std::endl; // Вывод: 2 (второй элемент массива{}
int value = 42;
int* ptr = &value;{}
int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr;{}
void func() {
std::cout << "Hello, World!" << std::endl;
}
void (*funcPtr)() = func;
funcPtr(); // Вызов функции через указатель{}
Ставь 👍 и забирай 📚 Базу знаний
class MyClass {
public:
MyClass() {}
};{}
class MyClass {
private:
int x;
public:
MyClass(int value) : x(value) {}
};{}
class MyClass {
private:
int x;
public:
MyClass(const MyClass &other) : x(other.x) {}
};{}
class MyClass {
private:
int* data;
public:
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr;
}
};{}
class MyClass {
private:
int x, y;
public:
MyClass(int value) : MyClass(value, 0) {}
MyClass(int value1, int value2) : x(value1), y(value2) {}
};{}
explicit для предотвращения неявных преобразований.
class MyClass {
public:
explicit MyClass(int value) {}
};{}
Ставь 👍 и забирай 📚 Базу знаний_fastcall передает первые два целочисленных аргумента (например, int, char, long) через регистры ECX и EDX на архитектуре x86. Остальные аргументы передаются через стек.
_fastcall обеспечивает совместимость с другими соглашениями о вызове, но это может потребовать дополнительных усилий для обеспечения совместимости при смешивании разных соглашений о вызове в одном проекте.
#include <iostream>
// Функция, использующая соглашение о вызове _fastcall
int __fastcall add(int a, int b) {
return a + b;
}
int main() {
int result = add(5, 3);
std::cout << "Result: " << result << std::endl; // Вывод: Result: 8
return 0;
}{}
_fastcall специфичен для архитектуры x86 и поддерживается не всеми компиляторами. На x64 используется другое соглашение о вызове, и _fastcall не применим.
_fastcall вместе с другими соглашениями о вызове (например, __cdecl, __stdcall), нужно быть осторожным, чтобы избежать ошибок при вызове функций с разными соглашениями о вызове.
_fastcall редко необходимо, так как современные компиляторы достаточно умны, чтобы автоматически оптимизировать вызовы функций, используя подходящие соглашения о вызове. В большинстве случаев вручную указывать _fastcall нет необходимости.
#include <iostream>
// Проверка платформы
#ifdef _M_IX86 // Если используется компилятор для архитектуры x86
int __fastcall add(int a, int b) {
return a + b;
}
#else
int add(int a, int b) {
return a + b;
}
#endif
int main() {
int result = add(5, 3);
std::cout << "Result: " << result << std::endl; // Вывод: Result: 8
return 0;
}{}
Ставь 👍 и забирай 📚 Базу знанийstd::string в C++ имеет несколько механизмов оптимизации для повышения производительности и уменьшения расхода памяти. Рассмотрим основные из них.
std::string не выделяет динамическую память, а хранит символы прямо внутри объекта std::string.
Обычно std::string содержит:
- Указатель на динамическую память
- Размер строки
- Вместимость (capacity)
Но если строка короткая, память не выделяется в куче (heap), а данные хранятся прямо внутри объекта std::string.
#include <iostream>
#include <string>
int main() {
std::string small = "Hello"; // Использует SSO
std::string large = "This is a very long string that will not fit SSO"; // Динамическая память
std::cout << "Small string: " << small << "\n";
std::cout << "Large string: " << large << "\n";
}{}
std::string использовал технику Copy-on-Write (COW), где несколько строк могли разделять одну и ту же память, пока одна из них не изменялась.
Почему отказались?
Не потокобезопасно (если один поток меняет строку, другой может получить неожиданные данные). В C++11 было добавлено std::move, которое делает копирование дешевле. SSO делает COW менее нужной.
std::string a = "Hello";
std::string b = a; // Копия не создается, оба указывают на одну память
b[0] = 'X'; // Теперь создаётся отдельная копия{}
std::string теперь можно перемещать с помощью std::move(), передавая владение ресурсом без копирования.
#include <iostream>
#include <string>
int main() {
std::string a = "Hello, world!";
std::string b = std::move(a); // Перемещение, a становится пустой
std::cout << "b: " << b << "\n"; // "Hello, world!"
}{}
.reserve(size), чтобы избежать многократных перевыделений памяти.
std::string str;
str.reserve(100); // Сразу выделяет память на 100 символов
for (int i = 0; i < 100; i++) {
str += 'a'; // Не перевыделяет память 100 раз
}{}
Ставь 👍 и забирай 📚 Базу знанийstatic и многопоточную безопасность.
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
// Удаляем конструкторы копирования и присваивания
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {} // Приватный конструктор
};{}
class Singleton {
public:
static Singleton& getInstance() {
return instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
static Singleton instance; // Статический экземпляр
};
Singleton Singleton::instance;{}
std::call_once и std::once_flag, можно обеспечить безопасность при доступе из нескольких потоков.
#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
std::call_once(initInstanceFlag, &Singleton::initSingleton);
return *instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() {}
static void initSingleton() {
instance = new Singleton();
}
static Singleton* instance;
static std::once_flag initInstanceFlag;
};
Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;{}
Отзывы канала
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
C/C++ | Вопросы собесов — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 4.3K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 5.2, количество отзывов – 1, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 4615.38 ₽, а за 3 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий