Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Bers
Заблокирован
#1

хитрая константа не даёт создать обычный массив - C++

25.11.2011, 18:47. Просмотров 3282. Ответов 64
Метки нет (Все метки)

Почему я не могу создать обычный массив, указав константу в качестве количества элементов?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int n=10;
const int N(n); //N вроде как константа 
                     //действительно получает значение 10
 
 
int A[N]; //error C2057: требуется константное выражение
             //error C2466: невозможно выделить память 
             //для массива постоянного нулевого размера
 
int main()
{
   int b= N; //b получает корректное значение 10
   const int c=N; //с получает корректное значение
   return 0;
};
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2011, 18:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос хитрая константа не даёт создать обычный массив (C++):

Можно ли создать проект не managed c++, а обычный c++, но с формами в VS2008? - C++
Можно ли создать проект не managed c++, а обычный c++, но с формами в VS2008?

Перевести обычный массив в векторный - C++
#include <iostream> #include <stdlib.h> #include <math.h> #include <time.h> using namespace std; int main() { int min =...

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

Скопировать элементы Vector в обычный массив - C++
Вобщем есть поля класса * arr // массив size // размер массива max_size //максимальный размер массива vector <Model> lst; ...

Как создать обычный файл exe, который могут открывать друзья. - C++
Всем доброе утро! Вопрос о том как сделать программу, которая запускалась бы одним файлом .exe. Создал программу (ну самую простейшую)....

Почему матрица выводится как обычный массив - C++
//matriza.h #pragma once class matriza { float *b,max,s; int n,m,nom; public: matriza(); void ww_matriza();

64
Сыроежка
Заблокирован
25.11.2011, 21:26 #46
Цитата Сообщение от Bers Посмотреть сообщение
В чем принципиальное отличие статической области памяти от кучи?
Статическая память имеет фиксированный размер, которая указывается в соответствующей области образа исполнимого файла. То есть это - неотъемлемая часть самой программы. А куча - эта память, кооторую выделяет для задания менеджер заданий. Она может меняться от одного запуска до следующего запуска на одной или разных платформах. А статическая память, являющаяся частью вашей программы, всегда фиксирована, независимо от того, в какой операционной среде вы свою программу будете запускать.
2
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
25.11.2011, 21:45 #47
Цитата Сообщение от Сыроежка Посмотреть сообщение
То есть это - неотъемлемая часть самой программы.
А стэк? Он тоже находите в программе?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 21:47 #48
Цитата Сообщение от Chelioss Посмотреть сообщение
А стэк? Он тоже находите в программе?
стек это просто часть виртуальной памяти, выделенной ОС для нужд программы
адресация этой памяти идет через стековые регистры процессора ebp, esp
1
Сыроежка
Заблокирован
25.11.2011, 21:51 #49
Цитата Сообщение от Chelioss Посмотреть сообщение
А стэк? Он тоже находите в программе?
Нет, стек не находится в программе. Вы лишь можете для своего модуля указать, какой максимальный размер стека ей может быть выделен менеджером программ при загрузке программы в память для выполнения. Стек не является образом программы, если только вы не пишите на ассемблере и сами туда что-то не поместили. Память, выделяемая заданию при загрузке его менеджером заданий может меняться. Например, программа может быть загружена в одну область памяти, а стек находиться в другой области памяти. Программа может, например, постоянно выгружаться из памяти компьютера во время выполнения, а стек оставться в памяти компютера. Это все зависит от архитектуры платформы.
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
25.11.2011, 21:51 #50
Цитата Сообщение от Сыроежка Посмотреть сообщение
Статическая память имеет фиксированный размер, которая указывается в соответствующей области образа исполнимого файла. То есть это - неотъемлемая часть самой программы.
C++
1
2
3
4
5
6
7
char mas[1024 * 1024 * 1024];
 
 
int main()
{
    return 0;
}
C++
1
2
3
4
int main()
{
    return 0;
}
Разницы в размере .exe, т.е. исполняемого файла, нет.
0
Bers
Заблокирован
25.11.2011, 21:55  [ТС] #51
Цитата Сообщение от alex_x_x Посмотреть сообщение
стек это просто часть виртуальной памяти, выделенной ОС для нужд программы
адресация этой памяти идет через стековые регистры процессора ebp, esp
Не дружу с ассемблером.
Но представляю себе стек, как своего рода кэш-память программы.
Она относительно маленькая, но очень быстрая.

В то время, как "природа" статической памяти и "природа" кучи мне видятся одинаковой. Ну.. не считая того, что статическая память имеет константный размер.

И если я правильно понял, то доступ к данным в куче (или к статикам) намного медленнее, чем доступ к данным на стеке.
0
Сыроежка
Заблокирован
25.11.2011, 21:56 #52
Цитата Сообщение от Chelioss Посмотреть сообщение
C++
1
2
3
4
5
6
7
char mas[1024 * 1024 * 1024];
 
 
int main()
{
    return 0;
}
C++
1
2
3
4
int main()
{
    return 0;
}
Разницы в размере .exe, т.е. исполняемого файла нет.
Хороший пример! Статическая память не хранится в образе программы, если она не инициализирована каким-то значениями, отличными от 0. В образе программы хранится лишь значение объема этой памяти, которая будет выделена программе при ее загрузки, для размещения в ней статических данных программы, и будет инициализирована нулем до входа в main. Это сделано специально того, чтобы уменьшить размер загрузочного модуля. Представьте себе, если бы выхранили всю эту память, которая ничем не инициализируется в образе загрузочного модуля. Тогда бы загрузочный модель вообще не смог бы поместиться на дискету!

Но если вы свой массив проинициализируете значениями отличными от 0, то вы увидите, что размер вашего модуля увеличился!

Да, и сделайте так. чтобы мне в следующий раз было интересно вам отвечать.
0
Bers
Заблокирован
25.11.2011, 21:57  [ТС] #53
Chelioss, возможно компилятор просто выбросил неиспользованную переменную за ненадобностью. У меня в таких случаях студия варинангами ругается
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 22:00 #54
Цитата Сообщение от Chelioss Посмотреть сообщение
Разницы в размере .exe, т.е. исполняемого файла нет.
1) массив может быть выпилен компилятором как неиспользуемый
2) для неинициализированных массивов исполняемый файл содержит лишь предписание загрузчика что где расположить
полагаю, если вы напишите char mas[1024 * 1024 * 1024] = {1,2,3,4,5,6,7,8,9,10};
размер изменится
0
Bers
Заблокирован
25.11.2011, 22:09  [ТС] #55
Цитата Сообщение от Сыроежка Посмотреть сообщение
Да, и сделайте так. чтобы мне в следующий раз было интересно вам отвечать
Из ваших ответов можно сделать одно очень смелое предположение:



C++
1
2
3
4
5
6
7
8
9
int b=100;
int main()
{
    int a=100;
    std::cout<< "Adress a= "<<&a<<std::endl;
    std::cout<< "Adress b= "<<&b<<std::endl;
 
   return 0;
};
Запускайте эту программку несколько раз. Обратите внимание на показания.
Адрес глобальной переменной не меняется

Я полагаю, объяснить это явление можно так: программа имеет фиксированный размер статической памяти. Причем этот размер формируется специально для того, что бы расположить в ней все глобал-статики данные, размеры которых известны на стадии компиляции.

Другими словами, все глобал-статики всегда размещаются по одним и тем же адресам.
И эти адреса не меняются от запуска к запуску программы.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 22:13 #56
Цитата Сообщение от Bers Посмотреть сообщение
И если я правильно понял, то доступ к данным в куче (или к статикам) намного медленнее, чем доступ к данным на стеке.
да
чтобы расположить данные на стеке надо сдвинуть пару регистров в процессоре (ясное дело что с виртуальной памятью и защищенным режимом свои усложнения, но в целом все просто)
просить памяти у ос не надо, так как она предварительно выделена в некотором количестве (при приближении к вершине стека может быть выделено еще, в каждой ос свои способы)
адресация относительная - адреса выделяются по нарастающей - выделение и отдача памяти элементарная и быстрая
проблема в том, что время жизни выделенной памяти жестко фиксировано стеком вызовов - поэтому такой способ выделения данных работает только для локальных переменных

куча же пользуясь системными вызовами запрашивает у ОС память - у стека она уже выделена при старте программы
кроме того менеджеру памяти постоянно приходится сталкиватся с фрагментацией и думать куда бы приткнуть данные пользователя
естественно логика его работы значительно сложней

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Другими словами, все глобал-статики всегда размещаются по одним и тем же адресам.
И эти адреса не меняются от запуска к запуску программы.
зависит от работы компилятора
да и вообще, во всех топовых компиляторах есть http://en.wikipedia.org/wiki/Address_space_layout_randomization
0
Bers
Заблокирован
25.11.2011, 22:13  [ТС] #57
alex_x_x, Да понятно, что выделять память на куче дольше.
Речь о самом доступе к данным. Само обращение к данным, которые живут на куче дольше, чем обращение к данным, которые живут на стеке
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 22:15 #58
Bers, без разницы - виртуальная память одна, что для кучи, что для стека, что для статических и глобальных данных
0
Bers
Заблокирован
25.11.2011, 22:17  [ТС] #59
Цитата Сообщение от alex_x_x Посмотреть сообщение
Bers, без разницы - виртуальная память одна, что для кучи, что для стека, что для статических и глобальных данных
Значит, если объекты уже созданы, то скорость работы с ними одинаковая; не зависит от того, где эти объекты живут: на стеке, или в куче?
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
25.11.2011, 22:21 #60
Цитата Сообщение от alex_x_x Посмотреть сообщение
просить памяти у ос не надо, так как она предварительно выделена в некотором количестве (при приближении к вершине стека может быть выделено еще, в каждой ос свои способы)
Т.е. программа владеет стековой памятью полностью, а кучой как бы и владеет, но не владеет. Не владеет в том, что памятью управляет менеджер памяти, а программа лишь запрашивает память. Владеет в том, что память отведена для именно этой программы и никакой больше.
Так?
0
25.11.2011, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 22:21
Привет! Вот еще темы с ответами:

Дан массив А на Н элементов (Н-константа). В массиве найти пять максимальных элементов. - C++
Дан массив А на Н элементов (Н-константа). В массиве найти пять максимальных элементов. Написать программу по шагам. Добавлено через...

Двумерный массив <array>. const int value = array.size(); value не константа? - C++
#include &lt;array&gt; #include &lt;iostream&gt; using std::array; using std::cout; /*ФУНКЦИЯ ЗАПОЛНЕНИЯ МАССИВА ЗНАЧЕНИЯМИ*/ template...

Даны функциональная константа, предикатная константа и определённое количество аксиом. Как построить модель - Логика и множества
Даны функциональная константа, предикатная константа и определённое количество аксиом. Как построит модель?

Модем (роутер) не даёт авторизоваться на некоторых сайтах, а также не даёт зарегистрировать антивирус - Сетевое оборудование
Здравствуйте! У меня такая ситуация. Обратилась ко мне знакомая - компьютер заблокировался (порнобаннер). Ну, я взял её комп и первым...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.