Re[10]: [Bug][VC] Cнова?
От: _nn_  
Дата: 02.06.10 10:41
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>Кстати, о следующем способе value-инициализации почему-то мало кто вспоминает.


M>
T var[1] = {}; // *var is value-initialized


А что должно происходит если есть член класса с конструктором ?
Должны обнулятся остальные члены класса или нет ?
struct nontrivial
{
  nontrivial() : member(4) {}
  ~nontrivial() {}

  int member;
};

struct base
{
  int i;
  char c;

  nontrivial n;
};

#include <stdio.h>


int main()
{  
  base bb[1] = {};
  base& b = bb[0];
  printf("b.i - %d\n", b.i);
  printf("b.c - %d\n", (int)b.c);
  printf("b.n.member - %d\n", b.n.member);
}


b.i — -858993460
b.c — -52
b.n.member — 4

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[11]: [Bug][VC] Cнова?
От: Кодт Россия  
Дата: 02.06.10 12:14
Оценка:
Здравствуйте, _nn_, Вы писали:

M>>Кстати, о следующем способе value-инициализации почему-то мало кто вспоминает.

Потому что, какая разница, как value-инициализировать, =T() или ={}.
Последняя форма, правда, неприменимо к одиночным не-POD-ам, — только к массивам.

__>А что должно происходит если есть член класса с конструктором ?

Или если есть vfptr

__>b.i — -858993460


Это который компилятор? gcc 4.5? Аха, значит, недофиксали.
Перекуём баги на фичи!
Re[11]: [Bug][VC] Cнова?
От: Masterkent  
Дата: 02.06.10 12:41
Оценка: 1 (1)
_nn>Должны обнулятся остальные члены класса или нет ?

По действующему стандарту — да. А по новым правилам начиная с N2798 здесь вообще потребуется полная zero-инициализация.
Re[10]: [Bug][VC] Cнова?
От: Кодт Россия  
Дата: 02.06.10 12:45
Оценка:
Здравствуйте, SleepyDrago, Вы писали:

SD>вы вдвоем с _nn_ меня просто убиваете. Смотрите — если кому то нужна инициализация, то он может ее написать руками 1 раз на тип. Правильно? Они напихали мемсеты почти везде и при этом оставили дырку в виде выделения на стеке, которая все равно требует явного написания тех же самых инициализаторов, чтобы не писать их каждый раз. Имхо мне нужны оба вида инициализации и задающиеся непересекающимся между собой образом.


Мы-то тут при чём? Мы в комитет по стандарту не входим. Вот они тебя пускай убивают, сколько влезет.
Нужны оба способа? Так оба способа и есть. Где там дырки на стеке???
struct Foo
{
  int x[1000];
  // и никаких конструкторов
};

void buz(const Foo&);

void bar()
{
  Foo f; // default/не инициализирована
  Foo g = {}; // value-инициализирована
  Foo h = Foo(); // value-инициализирована

  Foo *pf = new Foo; // default/не инициализирована
  Foo *ph = new Foo(); // value-инициализирована

  buz(Foo()); // value-инициализирована
  buz(Holder<Foo>()); // default/не инициализирована - вот здесь пришлось надстраиваться над синтаксисом
}


SD>А теперь с приходом gcc 4.4 в редхате, который исправляет "баг" с принудительной value-инициализацией pod членов классов, наступает java головного мозга. Код который всю жизнь был совместим с C по структурам придется обкладывать пустыми конструкторами, чтобы ... он был совместим с С хотябы по поведению.


В чём заключается совместимость? В том, чтобы поля были не инициализированы и содержали мусор? Можно считать, что нули — это такой специальный мусор.

SD>Шаблонные Холдеры это к санитарам. Туда же и с предложениями держать все структуры а-ля "прямоугольник" в двойном числе.

SD>первое правило: "меньше кода — меньше проблем".

Нафигачить пустые конструкторы в каждую структуру — это "меньше кода"?
Конечно, зависит от соотношения, сколько типов и сколько мест, где эти переменные создаются.
Я предположил, что "делал себе пул" означает, что был сделан некий шаблон, куда подставлялись разные типы структур. Из-за чего и пришлось пропатчить все структуры, чтобы мемсетами не замучило. Ну, так можно пропатчить непосредственно шаблон.

SD>YMMV разумеется


твоя гонка за скоростью, твой и mileage
Перекуём баги на фичи!
Re[12]: [Bug][VC] Cнова?
От: Masterkent  
Дата: 02.06.10 12:48
Оценка:
К>Потому что, какая разница, как value-инициализировать, =T() или ={}.

Разница есть. T t = T(); потребует, чтобы T был copyable.
Re[12]: [Bug][VC] Cнова?
От: _nn_  
Дата: 02.06.10 12:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это который компилятор? gcc 4.5? Аха, значит, недофиксали.

VC 2010.

GCC 4.4.3, 4.5 тоже не обнуляют.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[13]: [Bug][VC] Cнова?
От: Masterkent  
Дата: 02.06.10 13:02
Оценка:
А вот Intel C++ 11.0.061 обнуляет, причём в соответствии с C++0x (если убрать ": member(4)", то member тоже обнуляется)
Re[11]: [Bug][VC] Cнова?
От: SleepyDrago Украина  
Дата: 02.06.10 13:37
Оценка:
Здравствуйте, Кодт, Вы писали:

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


SD>>вы вдвоем с _nn_ меня просто убиваете. Смотрите — если кому то нужна инициализация, то он может ее написать руками 1 раз на тип. Правильно? Они напихали мемсеты почти везде и при этом оставили дырку в виде выделения на стеке, которая все равно требует явного написания тех же самых инициализаторов, чтобы не писать их каждый раз. Имхо мне нужны оба вида инициализации и задающиеся непересекающимся между собой образом.


К>Мы-то тут при чём? Мы в комитет по стандарту не входим. Вот они тебя пускай убивают, сколько влезет.

К>Нужны оба способа? Так оба способа и есть. Где там дырки на стеке???
Вы явно вошли в фанклуб любителей memset'а — вот этим и убиваете. Из-за того что людей которые "непожлобились" на левый мемсет стало много вообще и началась эта затея с _изменением_ семантики уже существующего кода на плюсах.
Дырка в их абстракции тотального обнуления. Его нет когда объект просто объявлен на стеке.

...

К>Нафигачить пустые конструкторы в каждую структуру — это "меньше кода"?

Этим структурам не нужна value initialization. Никогда. Поэтому из-за этих редисок этот код стал обязательным.

предложение бороться с шаблонами с помощью шаблонов принимается. К счастью это действительно редко нужно.

К>твоя гонка за скоростью, твой и mileage

ну это имхо единственное оправдание при использовании "портабельного ассемблера наших дней". Во всех остальных случаях те кто идут по более "декларативным" путям выигрывают во всем.
Re[12]: [Bug][VC] Cнова?
От: Кодт Россия  
Дата: 02.06.10 14:29
Оценка:
Здравствуйте, SleepyDrago, Вы писали:

SD>Вы явно вошли в фанклуб любителей memset'а — вот этим и убиваете.


Ты видишь то, чего нет. Во всяком случае, в отношении меня.

Мне вообще пофиг на принудительные мемсеты. Если мне надо, я постараюсь написать так, чтобы оно гарантированно произошло, а если мне не надо, не забиваю себе голову. Какая разница, чем замусоривать, нулями или CDCDCDCD.

SD>Из-за того что людей которые "непожлобились" на левый мемсет стало много вообще и началась эта затея с _изменением_ семантики уже существующего кода на плюсах.


Это когда они не пожлобились на изменение семантики? В 1998 стандарте был дефект, — возможность трактовать как попало. Этот дефект постарались устранить (не до конца).

SD>Дырка в их абстракции тотального обнуления. Его нет когда объект просто объявлен на стеке.


В чём заключается дырка, я так и не понял.
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.