вектор - проблема

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

вектор - проблема

Сообщение NT » 22 сен 2010, 13:32


Wild Bill, любимых Вами шаблонов не заметил
Последний раз редактировалось NT 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Wild Bill
Сообщений: 4820
Зарегистрирован: 26 июл 2009, 21:00

вектор - проблема

Сообщение Wild Bill » 22 сен 2010, 14:03

2 Munin
Видно забывать уже стал...

2 N T
Например, так

Код: Выбрать все

template<class X> class Vector{
 X* v;
 int size;
public:
 Vector();
 Vector(int);
 X& operator[] (int i)
};

template<class X> X Vector<X>::Vector(int N)
{
 v = new X [N];
};
Последний раз редактировалось Wild Bill 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

вектор - проблема

Сообщение NT » 22 сен 2010, 14:44

Поправочка:

template<class X>X Vector<X>::Vector(int N)
{
v = new X [N];
};
Последний раз редактировалось NT 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Wild Bill
Сообщений: 4820
Зарегистрирован: 26 июл 2009, 21:00

вектор - проблема

Сообщение Wild Bill » 22 сен 2010, 14:54

Согласен, спасибо.
Последний раз редактировалось Wild Bill 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

вздымщик Цыпа
Сообщений: 445
Зарегистрирован: 28 июн 2010, 21:00

вектор - проблема

Сообщение вздымщик Цыпа » 22 сен 2010, 21:34

fir-tree писал(а):Source of the post Вообще, операция new int[N] уже заполняет нулями (поскольку выполняются конструкторы для каждого элемента int).
Если речь o «плюсах», a не o чем-то другом, то конечно же никакого заполнения нулями тут не происходит, за неимением конструктора у int. B массиве остается тот мусор, который при аллокировании из хипа там был.

Хотя конечно матемтика тут не при чем
Последний раз редактировалось вздымщик Цыпа 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
fir-tree
Сообщений: 10669
Зарегистрирован: 19 июн 2008, 21:00

вектор - проблема

Сообщение fir-tree » 22 сен 2010, 22:58

вздымщик Цыпа писал(а):Source of the post Если речь o «плюсах», a не o чем-то другом, то конечно же никакого заполнения нулями тут не происходит, за неимением конструктора у int.

Ето по старому стандарту. По новому - встроенные типы уравноправили c пользовательскими. To есть хотя никакого конструктора у int и нет, он всё равно ведёт себя так, как будто есть.

Чтобы схлопотать массив c мусором, приходится пользоваться malloc(). Впрочем, и там может c инициализацией постараться уже операционка
Последний раз редактировалось fir-tree 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

вздымщик Цыпа
Сообщений: 445
Зарегистрирован: 28 июн 2010, 21:00

вектор - проблема

Сообщение вздымщик Цыпа » 22 сен 2010, 23:31

fir-tree писал(а):Source of the post Ето по старому стандарту. По новому - встроенные типы уравноправили c пользовательскими.
Это по которому, по C++0x? Я изменения его вроде внимательно смотрел, но такого там не встречал. A по текущему вот вполне современный пример:

Код: Выбрать все

_GLIBCXX_WEAK_DEFINITION void *
operator new (std::size_t sz) throw (std::bad_alloc)
{
 void *p;

 /* malloc (0) is unpredictable; avoid it. */
 if (sz == 0)
 sz = 1;
 p = (void *) malloc (sz);
 while (p == 0)
 {
 new_handler handler = __new_handler;
 if (! handler)
#ifdef __EXCEPTIONS
 throw bad_alloc();
#else
 std::abort();
#endif
 handler ();
 p = (void *) malloc (sz);
 }

 return p;
}


Ничего интересного сверх malloc. Это сам оператор. При его вызове тоже ничего лишнего не происходит:

Код: Выбрать все

int *p() {
 return new int[10];
}

транслируется в:

Код: Выбрать все

 .file "q.C"
 .text
 .align 2
 .p2align 4,,15
.globl p()
 .type p(), @function
p():
.LFB2:
 pushl %ebp
.LCFI0:
 movl %esp, %ebp
.LCFI1:
 subl $8, %esp .LCFI2:  movl $40, (%esp)
 call operator new[](unsigned int)
 leave
 ret
.LFE2:
 .size p(), .-p()
.globl __gxx_personality_v0
 .section .eh_frame,"a",@progbits
Последний раз редактировалось вздымщик Цыпа 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
fir-tree
Сообщений: 10669
Зарегистрирован: 19 июн 2008, 21:00

вектор - проблема

Сообщение fir-tree » 22 сен 2010, 23:46

вздымщик Цыпа писал(а):Source of the post Ничего интересного сверх malloc. Это сам оператор. При его вызове тоже ничего лишнего не происходит

Упс. B самом операторе и не должно ничего быть сверх malloc. A при его вызове - должно происходить. Компилятор подставляет.

Вот ассемблерный код operator new[](unsigned int) покажете? И версию компилятора, которую вы используете.
Последний раз редактировалось fir-tree 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

вектор - проблема

Сообщение NT » 22 сен 2010, 23:46

Инициализируется ли переменная если ей приделяют память через malloc?
B общем случае это зависит от стандарта реализации компилятора,
точнее от реализации функций malloc.h
Стадарт ANSI C - отвечает только за выделение затребованного размера,
так что инициализация лежит на пользователе.
Для calloc - область вроде обнуляется, но я бы советовал самому это делать - будет надежнее.
Последний раз редактировалось NT 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

вздымщик Цыпа
Сообщений: 445
Зарегистрирован: 28 июн 2010, 21:00

вектор - проблема

Сообщение вздымщик Цыпа » 23 сен 2010, 00:00

fir-tree писал(а):Source of the post Вот ассемблерный код operator new[](unsigned int) покажете?
Ассемблерный код оператора соответствиет тексту, в нем ничего интересного, a код вызова я только что приводил. B нем кроме вызова оператора ничего нет.
fir-tree писал(а):Source of the post И версию компилятора, которую вы используете.
Сейчас под руку подвернулся gcc 4.2.4. Старье конечно, но стандарту 98 года соответствует полностью.
Последний раз редактировалось вздымщик Цыпа 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 2 гостей