C сколько – c++ — Сколько памяти занимают ссылки?

C++ - В C ++, сколько памяти потребляют типы данных enum?

Предположим, у меня где-то объявлено следующее перечисление:

enum yin_yang {
yin,
yang
};

И я хочу использовать новый тип данных следующим образом:

yin_yang balance = yang;

Сколько памяти системы будет занимать «баланс»? 1 бит, 1 байт или что-то еще?

0

Решение

Занят ли он на самом деле память, зависит от того, что оптимизатор делает с вашим кодом, но если вы хотите узнать размер в байтах типа или объекта, вы можете использовать sizeof оператор:

std::cout << sizeof(yin_yang) << std::endl;
std::cout << sizeof(balance) << std::endl;

Это не значит что balance на самом деле должен занимать место в памяти во время выполнения. Это может быть полностью оптимизировано. Но размер объекта будет известен во время компиляции.

3

Другие решения

По крайней мере, в C ++ 11 вы можете указать целочисленный тип, который вы хотите использовать в качестве основы для перечисления:

enum yin_yang : uint8_t {
yin,
yang
};

В противном случае компилятор выбирает базовый тип, который будет целочисленным, хотя не указано, какой IIRC (и я полагаю, многие компиляторы по умолчанию int). Базовый тип определяет требования к хранилищу экземпляра enum.

2

Вы можете использовать унарный оператор ‘sizeof’, чтобы вычислить размер любой переменной или типа данных, измеренный в количестве единиц размера байта.

0

Для перечисленных областей, соответствующая часть взята из C ++ 14, [Decl.enum]:

Для перечисления, базовый тип которого не является фиксированным, базовый тип является целочисленным типом, который может представлять все значения перечислителя, определенные в перечислении. Если ни один целочисленный тип не может представлять все значения перечислителя, перечисление некорректно сформировано. Это определяется реализацией, какой целочисленный тип используется в качестве базового типа, за исключением того, что базовый тип не должен быть больше, чем int если значение перечислителя не может вписаться в int или же unsigned int, Если список-перечислитель пуст, базовый тип выглядит так, как если бы перечисление имело единственный перечислитель со значением

0,

Таким образом, если перечисленные состояния представимы в int тогда это гарантированно будет ≤ sizeof(int)больше если нет. Конечно, если вы явно указали базовый тип, то вы знаете его размер.

0

Тип enum — это специальный тип данных, который позволяет переменной быть набором предопределенных констант. Неважно, сколько единиц она имеет

Например,

enum Days {воскресенье, понедельник, вторник, среда, четверг, пятница, суббота};

enum Letter {a, b, c, d};

Выше обоих перечислимый размер данных составляет всего 4 байта

0

web-answers.ru

Количество цифр в числе | C++ для приматов

Задача взята с сайта e-olymp.

Условие

Вычислить количество цифр целого неотрицательного числа [latex]n[/latex].

Входные данные

Одно не отрицательное целое число [latex]n[/latex] [latex](0<=n<=2*10^9)[/latex].

Выходные данные

Количество цифр в числе [latex]n[/latex].

 

Тесты

Число Количество цифр
1 1
20 2
123 3

Код

#include <iostream>

using namespace std;

 

int main() {

int x, n=1;

cin >> x;

while ((x/=10) > 0) n++;

cout << n;

return 0;

}

Решение

Сначала объявляем переменную [latex] n [/latex] для подсчета цифр в числе и присваиваем ей значение 1. Далее используем цикл while, проверкой которого ставим деление числа на 10 — так как тип числа int, это «отбрасывает» последнюю цифру в числе. Пока результат проверки истинный, инкриментируем n на 1.

Код программы

Засчитанное решение

Альтернативное решение с помощью десятичного логарифма

Сначала проверяется, не является ли введенное число нулем, так как невозможно посчитать любой логарифм от нуля. Если число отлично от нуля, находим десятичный логарифм от числа, прибавляем к нему единицу (что соответствует количеству цифр в числе). Берем целую часть от найденного, в случае, если число не кратно 10.

#include <iostream>

#include <cmath>

using namespace std;

 

int main() {

int x;

cin >> x;

cout << (x==0? 1: int (log10 (x) + 1));

return 0;

}

 

Код решения

Posted in 3. Циклы. Tagged Количество цифр в числе.

cpp.mazurok.com

C++ - Сколько потоков может создать приложение C ++

Я хотел бы знать, сколько потоков может создать приложение C ++ максимум.
Влияет ли на эти границы ОС, аппаратные ограничения и другие факторы?

14

Решение

C ++ как язык не определяет максимум (или даже минимум за пределами одного). Конкретная реализация может, но я никогда не видел, чтобы это было сделано напрямую. ОС также может, но, как правило, просто заявляет о том, что ограничен системными ресурсами. Каждый поток использует некоторую нестраничную память, таблицы селекторов, другие связанные вещи, так что вы можете исчерпать это. Если вы этого не сделаете, система перестает отвечать на запросы, если потоки действительно работают.

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

13

Другие решения

[C++11: 1.10/1]: [..] В размещенной реализации программа на C ++ может иметь одновременно несколько потоков. [..] В автономной реализации определяется реализация, может ли программа иметь более одного потока выполнения.

[C++11: 30.3/1]: 30.3 описывает компоненты, которые можно использовать для создания и управления потоками. [ Заметка:

Эти потоки предназначены для сопоставления один-к-одному с потоками операционной системы. —Конечная записка]

Так что, в основном, дело за реализацией & ОПЕРАЦИОННЫЕ СИСТЕМЫ; C ++ не волнует!

Он даже не перечисляет рекомендации в Приложение Б «Реализация количества»! (что похоже на упущение, на самом деле).

19

В основном, есть без ограничений на вашем C ++ уровень приложения. Количество максимальных потоков больше на Уровень ОС (в зависимости от вашей архитектуры и доступной памяти).

В линуксе, нет ограничений на максимальное количество потоков на процесс. Количество ниток ограничено всей системой. Вы можете проверить количество максимально допустимых потоков, выполнив:

cat /proc/sys/kernel/threads-max

На винде Вы можете использовать Testlimit Инструмент для проверки максимального количества ниток:
http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

В Mac OS, пожалуйста, прочитайте этот стол найти номер потока на основе конфигурации вашего оборудования

Тем не менее, имейте в виду, что вы находитесь на многозадачная система. Количество одновременно выполняемых потоков ограничено общим количеством доступных процессорных ядер.. Чтобы сделать больше вещей, система пытается переключаться между всеми этими потоками. Каждый «переключатель» имеет производительность (несколько миллисекунд). Если ваша система слишком «переключается», она не будет слишком много времени для «работы», и ваша система будет работать медленно.

6

Как правило, пределом количества потоков является объем доступной памяти, но существуют системы, которые имеют более низкие пределы.

Если вы не сходите с ума от создания потоков, очень маловероятно, что будет иметь ограничение ограничение. Создание большего количества потоков редко выгодно, как только вы достигнете определенного числа — это число может быть примерно таким же или в несколько раз превышать количество ядер (которое для настоящего большого и тяжелого оборудования может составлять несколько сотен в наши дни, с 16-ядерными процессорами и 8 разъемами).

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

Потоки, которые выполняют ввод-вывод или иным образом «сидят без дела», могут быть более многочисленными — 2-5 на ядро ​​процессора кажется разумным Учитывая, что современные машины имеют 8 сокетов и 16 ядер на более высоком конце спектра, это все еще только около 1000 потоков.

Конечно, можно спроектировать, скажем, систему веб-сервера, в которой каждое соединение является потоком, и в любой момент времени система имеет активные соединения 10 или 20 тысяч. Но это, наверное, не самый эффективный.

3

Помимо общей непрактичности наличия большего количества потоков, чем ядер, да, есть ограничения. Например, система может хранить уникальный «идентификатор процесса» для каждого потока, и их может быть только 65535. Кроме того, каждый поток будет иметь свой собственный стек, и эти стеки со временем будут занимать слишком много памяти (однако вы можете регулировать размер каждого стека при создании потоков).

Вот информативная статья — не обращайте внимания на тот факт, что в ней упоминается Windows, так как эти концепции похожи на другие распространенные системы: http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx

0

В стандарте C ++ нет ничего, что ограничивало бы количество потоков. Тем не менее, ОС, безусловно, будет иметь жесткое ограничение.

Наличие слишком большого количества потоков снижает пропускную способность вашего приложения, поэтому рекомендуется использовать пул потоков.

0

Я хотел бы знать, сколько потоков может создать приложение C ++ максимум.

Реализация / OS-зависимый.

Имейте в виду, что до C ++ 11 не было потоков в C ++.

Влияет ли на эти границы ОС, аппаратные ограничения и другие факторы?

Да.

ОС может ограничить число потоков, которые может создать процесс.
ОС может ограничить общее количество одновременно работающих потоков (для предотвращения разрыва бомб и т. Д. Linux определенно может это сделать).
Доступная физическая (и виртуальная) память будет ограничивать количество потоков, которые вы можете создать, ЕСЛИ каждый поток выделяет свой собственный стек.
Может быть (возможно жестко закодировано) ограничение на количество потоковых «дескрипторов», которые может предоставить ОС.
Базовая ОС / платформа может вообще не иметь потоков (компилятор реального режима для DOS / FreeDOS или что-то подобное).

0

web-answers.ru

Отправить ответ

avatar
  Подписаться  
Уведомление о