memset(this, 0, sizeof(T));
От: makdak  
Дата: 22.11.16 18:32
Оценка:
Всем привет!
можно ли так делать в членах класса?
так то работает, сегодня..
Re: memset(this, 0, sizeof(T));
От: antropolog  
Дата: 22.11.16 18:39
Оценка:
Здравствуйте, makdak, Вы писали:

добавить статическую проверку для POD ( is_pod + remove_pointer для this)
добавить рантайм-проверку для this != nullptr

теперь можно.
Re: memset(this, 0, sizeof(T));
От: Dair Россия  
Дата: 22.11.16 18:50
Оценка: +2
Здравствуйте, makdak, Вы писали:

M>можно ли так делать в членах класса?


Нет, категорически нельзя.

1. Класс может завтра стать виртуальным и ты обнулишь таблицу виртуальных функций.
2. Как подействует такой хак на член типа std::string?
Re: memset(this, 0, sizeof(T));
От: jazzer Россия Skype: enerjazzer
Дата: 22.11.16 19:14
Оценка: +4
Здравствуйте, makdak, Вы писали:

M>можно ли так делать в членах класса?


А зачем?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: memset(this, 0, sizeof(T));
От: turbocode  
Дата: 22.11.16 19:57
Оценка: 1 (1) -3
M>можно ли так делать в членах класса?
M>так то работает, сегодня..

Вам точно класс нужен?
Для структуры можно, для класса в общем случае нельзя.
Re[2]: memset(this, 0, sizeof(T));
От: SaZ  
Дата: 22.11.16 20:38
Оценка:
Здравствуйте, turbocode, Вы писали:


T>Для структуры можно, для класса в общем случае нельзя.


В C++ это одно и то же, с точки зрения организации памяти.
Re[3]: memset(this, 0, sizeof(T));
От: turbocode  
Дата: 22.11.16 21:21
Оценка:
SaZ>В C++ это одно и то же, с точки зрения организации памяти.

Класс сам так и просится чтобы его нафаршировали фичами, а структуры обычно никто не трогает (даже студенты).
Re: memset(this, 0, sizeof(T));
От: c-smile Канада http://terrainformatica.com
Дата: 22.11.16 21:38
Оценка: 8 (2) +1
Здравствуйте, makdak, Вы писали:

M>Всем привет!

M>можно ли так делать в членах класса?
M>так то работает, сегодня..


Я в иаких случаях делаю так:

struct data_t {
  ... mostly pod or zero initialized c++ objects
};

class Data {

  data_t data;

  Data() { memzero(data); }

}
Re[2]: memset(this, 0, sizeof(T));
От: makdak  
Дата: 23.11.16 06:45
Оценка:
Здравствуйте, jazzer, Вы писали:

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


M>>можно ли так делать в членах класса?


J>А зачем?


Чтобы обнулить всё в нём. Смотрю исходники, везде юзают:
 memset(pointer_to_obj_T, 0, sizeof(T));

вот и думаю почему ни кто не делает это в члене класса, тем более если такая операция многократно используется, над одним и тем же объектом..
думаю, дай поинтересуюсь, может что новое узнаю
Re: memset(this, 0, sizeof(T));
От: smeeld  
Дата: 23.11.16 07:07
Оценка:
Здравствуйте, makdak, Вы писали:

M>Всем привет!

M>можно ли так делать в членах класса?
M>так то работает, сегодня..

C-like структуры можно без проблем.
Re[3]: memset(this, 0, sizeof(T));
От: Ops Россия  
Дата: 23.11.16 07:45
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>В C++ это одно и то же, с точки зрения организации памяти.


Если говорить про ключевые слова, то да. А если логически разделять, не привязываясь к языку?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: memset(this, 0, sizeof(T));
От: N. I.  
Дата: 23.11.16 08:06
Оценка:
makdak:

J>>А зачем?


M>Чтобы обнулить всё в нём. Смотрю исходники, везде юзают:
 memset(pointer_to_obj_T, 0, sizeof(T));

Это чьи-то сишные привычки. В C++ подобное делается через инициализацию с пустым списком параметров:

struct S
{
    ....
};

class C
{
public:
    void reset()
    {
        m_s = S();
    }
private:
    S m_s = {};
};
Re[4]: memset(this, 0, sizeof(T));
От: smeeld  
Дата: 23.11.16 08:09
Оценка:
Здравствуйте, N. I., Вы писали:


NI>Это чьи-то сишные привычки. В C++ подобное делается через инициализацию с пустым списком параметров:


Это не прокатит если требуется обнулить поля объекта в какой-то момент после инициализации.
Re[5]: memset(this, 0, sizeof(T));
От: N. I.  
Дата: 23.11.16 08:15
Оценка:
smeeld:

NI>>Это чьи-то сишные привычки. В C++ подобное делается через инициализацию с пустым списком параметров:


S>Это не прокатит если требуется обнулить поля объекта в какой-то момент после инициализации.


В чём сложности?
Re[6]: memset(this, 0, sizeof(T));
От: smeeld  
Дата: 23.11.16 08:21
Оценка:
Здравствуйте, N. I., Вы писали:


NI>В чём сложности?


Ни в чём, просто почему бы не распространить такой способ обнуления и на не POD структуры, удобно же.
Re[7]: memset(this, 0, sizeof(T));
От: N. I.  
Дата: 23.11.16 08:32
Оценка:
smeeld:

S>Ни в чём, просто почему бы не распространить такой способ обнуления и на не POD структуры, удобно же.


Инициализация с () или {} одинаково хорошо работает и с POD, и с non-POD. Присваивание временного объекта тоже. А memset-ом можно ненароком занулить то, что нулём быть не должно.
Re[8]: memset(this, 0, sizeof(T));
От: smeeld  
Дата: 23.11.16 08:47
Оценка:
Здравствуйте, N. I., Вы писали:



NI>Инициализация с () или {} одинаково хорошо работает и с POD, и с non-POD. Присваивание временного объекта тоже. А memset-ом можно ненароком занулить то, что нулём быть не должно.


Если у меня struct A{...}, то она без проблем автоматически обнуляется через присвоение {} её ссылке, если у нас class B{...} с виртуальной таблицей и прочими причиндалами, то нифига присвоение {} ссылке не обнуляет поля, для этого нужно писать уже operator= с initializer_list-ом в котором приравнивать нулю поля.
Re[2]: memset(this, 0, sizeof(T));
От: Dair Россия  
Дата: 23.11.16 09:16
Оценка:
Здравствуйте, smeeld, Вы писали:

S>C-like структуры можно без проблем.


struct NullMe {
    void* memory;
    size_t size;
};


При обнулении получишь утечку в общем случае. Вполне c-like структура.
Re: memset(this, 0, sizeof(T));
От: uzhas Ниоткуда  
Дата: 23.11.16 09:17
Оценка: 1 (1)
Здравствуйте, makdak, Вы писали:

M>так то работает, сегодня..


memset — широко известный рассадник багов, ибо игнорирует типы
ссылка по теме: http://rsdn.org/forum/cpp.applied/5886694
Автор: uzhas
Дата: 10.12.14
Re[9]: memset(this, 0, sizeof(T));
От: N. I.  
Дата: 23.11.16 10:37
Оценка:
smeeld:

S>Если у меня struct A{...}, то она без проблем автоматически обнуляется через присвоение {} её ссылке, если у нас class B{...} с виртуальной таблицей и прочими причиндалами, то нифига присвоение {} ссылке не обнуляет поля, для этого нужно писать уже operator= с initializer_list-ом в котором приравнивать нулю поля.


А что такое нулевое значение для класса "с виртуальной таблицей и прочими причиндалами"? То-то ж и оно, что в подобной реализации сброса поля обычно заполняются некими дефолтными значениями, которые могут быть либо нулями, либо чем-то ещё. И, покуда класс T предоставляет возможность получить дефолтное значение T() и присвоить его другому объекту t = T(), то же самое можно делать с его агрегатами:

struct S
{
    T t;
    int i;
};

S s;
....
s = S();

Такой код корректно отработает независимо от того, какой последовательностью побайтовых значений может быть представлено дефолтное значение s.t.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.