массив в классе
От: Аноним  
Дата: 31.01.04 15:47
Оценка:
Если есть массив в классе

class asd
{

private:
unsigned char a[20];
};
то будет ли он забит нулями при конструировании обьекта, или ручками обнулять надо ?
Re: массив в классе
От: IT Россия linq2db.com
Дата: 31.01.04 15:56
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>то будет ли он забит нулями при конструировании обьекта, или ручками обнулять надо ?


ручками.
Если нам не помогут, то мы тоже никого не пощадим.
Re: массив в классе
От: Olegator  
Дата: 31.01.04 19:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Если есть массив в классе


А>class asd

А>{

А>private:

А> unsigned char a[20];
А>};
А>то будет ли он забит нулями при конструировании обьекта, или ручками обнулять надо ?

Если немножко изменить код класса, то всё будет в шоколаде:

class asd
{
public:
    asd()
    {
        for(int i = 0; i < 20; i++)
            a[i] = 0;
    }
private:
    unsigned char a[20];
};

После создания объекта массив будет состоять из нулей.

С уважением,
Olegator
... << RSDN@Home 1.1.3 beta 1 >>
Re: массив в классе
От: alexkro  
Дата: 01.02.04 06:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если есть массив в классе


А>class asd

А>{

А>private:

А> unsigned char a[20];
А>};
А>то будет ли он забит нулями при конструировании обьекта, или ручками обнулять надо ?

А ежели вот так сделаешь, то само обнуляться будет:

#include <vector>
class asd {
public:
    asd() : a_( 20 ) {}
private:
    std::vector< unsigned char > a_;
};


А если performance волнует, то можно и boost::array взять, который представляет замену статическим массивам (vector — динамическим).
Re[2]: массив в классе
От: IT Россия linq2db.com
Дата: 01.02.04 17:15
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Если немножко изменить код класса, то всё будет в шоколаде:


Тогда уж лучше так

class asd
{
public:
    asd()
    {
        memset(a, 0, sizeof(a));
    }
private:
    unsigned char a[20];
};
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: массив в классе
От: ArtDenis Россия  
Дата: 01.02.04 17:25
Оценка: +1 :)
Здравствуйте, IT, Вы писали:

Настоящие C++-шники делают так:
std::fill(a, a+sizeof(a)/sizeof(a[0]), 0);

... << RSDN@Home 1.1.2 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: массив в классе
От: Xentrax Россия http://www.lanovets.ru
Дата: 01.02.04 22:39
Оценка:
Здравствуйте, alexkro, Вы писали:

A>А ежели вот так сделаешь, то само обнуляться будет:


A>
A>#include <vector>
A>class asd {
A>public:
A>    asd() : a_( 20 ) {}
A>private:
A>    std::vector< unsigned char > a_;
A>};
A>


А если компилятор некомплиантный и не обнуляет POD типы при явном вызове конструктора?
Re[4]: массив в классе
От: vdimas Россия  
Дата: 01.02.04 23:38
Оценка: 30 (1)
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, IT, Вы писали:


AD>Настоящие C++-шники делают так:

AD>
AD>std::fill(a, a+sizeof(a)/sizeof(a[0]), 0);
AD>

AD>

не согласен,
memset в том же наипопулярнейшем VC7.1 компилится в инлайноыую ассемблерную оптимизированную вставку, а этот fill как угодно реализован может быть, напр. как в первом ответе.
Re[3]: массив в классе
От: vdimas Россия  
Дата: 01.02.04 23:42
Оценка:
Здравствуйте, Xentrax, Вы писали:

X>Здравствуйте, alexkro, Вы писали:


A>>А ежели вот так сделаешь, то само обнуляться будет:


A>>
A>>#include <vector>
A>>class asd {
A>>public:
A>>    asd() : a_( 20 ) {}
A>>private:
A>>    std::vector< unsigned char > a_;
A>>};
A>>


X>А если компилятор некомплиантный и не обнуляет POD типы при явном вызове конструктора?


конструктор вектора, по идее, явно заполняет указанным значением (здесь — char() )

но дело даже не в этом, а в том, что вектор предполагает ДИНАМИЧЕСКОЕ выделение памяти, так что, не мороча голову и не заставляя несчастный проц потеть выбираем тривиальный вариант с memset.
Re[5]: массив в классе
От: IT Россия linq2db.com
Дата: 02.02.04 00:09
Оценка:
Здравствуйте, vdimas, Вы писали:

V>не согласен,

V>memset в том же наипопулярнейшем VC7.1 компилится в инлайноыую ассемблерную оптимизированную вставку, а этот fill как угодно реализован может быть, напр. как в первом ответе.

Кстати, да
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: массив в классе
От: ArtDenis Россия  
Дата: 02.02.04 05:49
Оценка: 16 (2)
Здравствуйте, IT, Вы писали:
IT>Кстати, да

Ага, а потом напишешь вот такую штуку:

template <typename T>
class asd
{
public:
    asd()
    {
        memset(a, 0, sizeof(a));
    }
private:
    T a[20];
};

asd<std::string> array;


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

ЗЫ: если кому интересно, VC7.1 делает 'fill' для типа 'char' через memset
... << RSDN@Home 1.1.2 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: массив в классе
От: Flex2 Россия  
Дата: 02.02.04 07:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если есть массив в классе


А>class asd

А>{

А>private:

А> unsigned char a[20];
А>};
А>то будет ли он забит нулями при конструировании обьекта, или ручками обнулять надо ?

А конструктор для чего ?
Re[5]: массив в классе
От: Павел Кузнецов  
Дата: 02.02.04 11:35
Оценка:
Здравствуйте, vdimas, Вы писали:

AD>>
 AD>> std::fill(a, a+sizeof(a)/sizeof(a[0]), 0);
 AD>>


v> memset в том же наипопулярнейшем VC7.1 компилится в инлайноыую

v> ассемблерную оптимизированную вставку, а этот fill как угодно
v> реализован может быть

В STLport выливается в ту же самую ассемблерную вставку.

v> напр. как в первом ответе.


И еще очень большой вопрос, что окажется быстрее для маленьких N.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[7]: массив в классе
От: IT Россия linq2db.com
Дата: 02.02.04 12:55
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD> Ага, а потом напишешь вот такую штуку:


OK, аргумент принимается

AD>и будешь удивляться, почему такая программа не работает.


Такие ошибки ловятся достаточно быстро, но, согласен, лучше их вообще не делать.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: массив в классе
От: Libra Россия  
Дата: 03.02.04 13:44
Оценка:
Здравствуйте, Flex2, Вы писали:

F>А конструктор для чего ?


Дык, ведь нужен массив из N элементов....
Species come and go, but the earth stands forever fast...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.