Форум программистов, компьютерный форум CyberForum.ru

С++ VLA и прочее... - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.11.2012, 00:17     С++ VLA и прочее... #1
 Комментарий модератора 
Перенесено из Порекомендуйте компилятор


Dev-C++ меня удивляет. Вот такой код компилирует без ошибок и предупреждений:
C++
1
2
3
4
5
6
7
int main()
{
    int m;
    int arr[m];
    
    return 0;
}
А такой и выполняет:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main()
{
    int m;
    cin >> m;
    int arr[m];
    
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 20:23     С++ VLA и прочее... #41
Цитата Сообщение от Jupiter Посмотреть сообщение
не надо нам VLA! это зло
в cstyle нужен. Однако вспомним что с++ это ООП и такой класс скомпилируется, но работать не будет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class A
{
public:
    int array[];
    uint32_t siz;
 
    A(uint32_t s)
    {
        siz = s;
        array[ siz ];
 
        for (uint32_t i = 0; i < siz; ++i)
            array[ i ] = i;
    }
 
    ~A(){}
 
    uint32_t size() { return siz; }
 
    void print()
    {
        for (uint32_t i = 0; i < siz; ++i)
            std::cout << std::setw(3) << array[ i ];
    }
 
};
Поэтому используя ООП нам не удастся создать элемент класса с использованием VLA, а вот создание локального массива с использованием VLA имеет смысл.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
01.12.2012, 20:33     С++ VLA и прочее... #42
Лично мое мнение, что массивы для сей, а там и VLA есть. В С++ можно с радостью использовать вектора и проблем не знать.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 20:36     С++ VLA и прочее... #43
а как же кампатибл, энивэй что есть в сях, есть в плюсах.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
01.12.2012, 20:40     С++ VLA и прочее... #44
Цитата Сообщение от alsav22 Посмотреть сообщение
Выделение памяти произойдёт при входе в main() до выполнения первой инструкции в тексте кода:
По моему разумению всё должно идти своим чередом, инструкция за инструкцией. То есть сперва печать "Entry", потом выделение памяти под "m", потом инициализация "m", потом печать "m". Посмотрим в отладчике. С cout тяжело отследить, а с printf легко

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main() { 
 cout << "Entry"; 
 int m = 3; 
 printf ("%d", m); 
 return 0; 
}
отследил, было так: сперва выделение памяти X, потом печать "Entry", потом занесение в X-> 3, потом выделение памяти Y, потом занесение в Y->3, потом печать "m". Причём при печати "m" использовалось значение ячейка памяти Y а не X.

Цитата Сообщение от alsav22 Посмотреть сообщение
Выделение памяти произойдёт при входе в main() до выполнения первой инструкции в тексте кода:
ну то есть в данном конкретном случае выделение памяти и инициализация произошло как до так и после печати "Entry". Фактически в main под переменную "m" было выделено две ячейки памяти. Учитывая, что при печати "m" использовалась ячейка памяти Y, я бы сказал что после. А зачем комплятор придумал занесение X-> 3 (до печати "Entry") я не знаю и знать не хочу

Зачем тебе вообще это? Ну если так надо знать, сходи на wasm.ru, там в раздел "исследование программ", там научат работать с отладчиком. А то я закалебусь смотреть постоянно.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
01.12.2012, 20:40     С++ VLA и прочее... #45
activnaya, так он и есть. VS не поддерживает стандарт C99, VLA на С и С++ нет. gcc (MinGW) поддерживает C99. VLA есть и в С и в С++, хоть последнее и не по стандарту.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
01.12.2012, 20:47     С++ VLA и прочее... #46
Хотя нет, я поторопился с выводами. Выделение ячейки памяти Y под "m" было для функции "printf", так всегда делается. Значит всё же имеем вот это выделение памяти:
C++
1
int m= 3;
до печати "Entry", а инициализацию после.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
01.12.2012, 21:00     С++ VLA и прочее... #47
Цитата Сообщение от activnaya Посмотреть сообщение
энивэй что есть в сях, есть в плюсах.
Ну это не так. __VA_ARGS__ только в С++11 добавили, неявного приведения любого указателя из void * вроде вообще никогда не было, те же VLA. Всё таки это разные языки.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.12.2012, 21:12     С++ VLA и прочее... #48
Цитата Сообщение от activnaya Посмотреть сообщение
а вот создание локального массива с использованием VLA имеет смысл.
смысл имеет использование стекового аллокатора
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.12.2012, 15:39     С++ VLA и прочее... #49
Макрос __VA_ARGS__ как минимум в gcc реализован уже давно.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
02.12.2012, 17:47     С++ VLA и прочее... #50
Цитата Сообщение от gray_fox Посмотреть сообщение
__VA_ARGS__ только в С++11 добавили
#include <cstdarg> и не надо никаких с++11
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
02.12.2012, 18:42     С++ VLA и прочее... #51
Цитата Сообщение от activnaya Посмотреть сообщение
#include <cstdarg> и не надо никаких с++11

Не по теме:

Как без с++11 ? Я уже стал слишком слаб и нежен, без него не умею(

Зачем жить, если -std=++98

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2012, 18:54     С++ VLA и прочее...
Еще ссылки по теме:

C++ Размер примитивных типов, выравнивание и прочее
Инкремент, декремент и прочее. A+++ - что означают это три плюса C++
C++ Рекурентная формула и прочее

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

Или воспользуйтесь поиском по форуму:
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
02.12.2012, 18:54     С++ VLA и прочее... #52
MrGluck, а вот не правда я не призывала не использовать с++11. Я только намекнула субъекту, что он как бэ немного не в теме.
Yandex
Объявления
02.12.2012, 18:54     С++ VLA и прочее...
Ответ Создать тему
Опции темы

Текущее время: 16:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru