Член структуры, созданный дважды в пользовательском конструкторе?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Член структуры, созданный дважды в пользовательском конструкторе?

Сообщение Anonymous »

Код: Выделить всё

struct PhiBlock
{
int64_t bsize;              // block size
vector ind;        // 0/1 to track [pmin(y) > pb]
fenwick_tree phi_sum;       // partial sums

PhiBlock (int64_t bsize, int64_t a):
phi_sum(ind)
{
this->bsize = bsize;
ind.resize(bsize, 1);
phi_sum = fenwick_tree(ind);
}
// ...
Моя структура данных:

Код: Выделить всё

struct fenwick_tree
{
size_t len; // 0-based len
std::vector t; // 1-based tree, indexes [1:len]

fenwick_tree(std::vector const &a)
{
len = a.size();
t.assign(len + 1, 0);
for (size_t i = 0; i < len; ++i)
add_to(i, a[i]);
}

// ...
};
Если я не включаю список инициализации членов для PhiBlock, GCC жалуется на отсутствие соответствующего вызова функции fenwick_tree::fenwick_tree(). Итак, вот что, по моему мнению, происходит:
  • Код: Выделить всё

    fenwick_tree
    не имеет конструктора по умолчанию, поэтому мне приходится использовать инициализацию элемента phi_sum(ind), где ind по умолчанию создается как вектор, который должен быть пустым.
    < /li>

    Код: Выделить всё

    indРазмер 
    изменяется.
  • Новое fenwick_tree создается с использованием ind, затем phi_sum установлено на это значение, однако реализован оператор =.
Это правильно? Должен ли phi_sum создаваться дважды? Если бы я смоделировал свое fenwick_tree на основе контейнеров стандартной библиотеки, то у него должен быть конструктор по умолчанию, который ничего не делает - тогда мне не понадобится список инициализации членов, верно?
Обновление: вот вывод gcc https://godbolt.org/z/5Y7Y9o15W
Мне трудно понять, что происходит, но, насколько я могу судить на основе вызовы:
  • Первый оператор вызова new(unsigned long) предназначен для fenwick_tree.len
  • Второй вызов std::vector::_M_fill_insert(__gnu_cxx::__normal_iterator, unsigned long, long const&) предназначен для ind.resize
  • Третий и четвертый оператор вызова new(unsigned long ) и вызов memset предназначены для fenwick_tree.t
Без -O2 fenwick_tree явно строятся дважды. Я предполагаю, что с -O2 fenwick_tree не создается дважды.

Подробнее здесь: https://stackoverflow.com/questions/793 ... onstructor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»