почему такой sizeof?

pulmo

class CAdditional
{
public:
double z;
unsigned long id;
CAdditional;
virtual ~CAdditional;
};
sizeof(CAdditional) ==24
sizeof(double) + sizeof(unsigned long) = 12
почему?

voronetskaya

напиши #pragma pack(1)

не, чето я не то написал %)

pulmo

а где это писать? я это радом с инклудами поставил и толку никакого

voronetskaya

что почему-то?
sizeof(double) + sizeof(unsigned long) == 8 + 4 == 12, все тут ок.

sizeof(CAdditional) == sizeof(double) + sizeof(unsigned long) + 3 указателя(конструктор, деструктор, this) == 24, тоже вроде все ок...

pulmo

а если я массив таких штук хочу сделать то оно будет 24*NomberOfElements? как-то глупо это выглядит, зачем мне скажем 10000 одинаковых конструкторов? что struct юзать чтоли?

ol4a21

Без паники.
Конструкторы и прочие там методы никакого места не занимают, так же как и статические члены.
Зайди в Project->Settings->C/C++->Code Generation и поставь Struct Member Alignment в 1byte и посмотри что получица

Кроме выравнивания, может потеряться память только еще на vtbl-указатель

onairika

Плюсы говно

voronetskaya

>Struct Member Alignment в 1byte
#pragma pack(1) - это ровно оно же
Ты хочешь сказать, что в экземпляре класса нет указателей на его членофункции? но тогда на vtbl его тоже не должно быть.
но this-то там должен быть...

ol4a21

>Ты хочешь сказать, что в экземпляре класса нет указателей на его членофункции? но тогда на vtbl его тоже не должно быть.

а зачем? они что, у разных экземпляров класса разные?
а вот на втбл (или аналог) он нужен, на этом весь плюсовый полиморфизм построен

>но this-то там должен быть...

ggggg

2

всё - говно
но что поделаешь, если сейчас это модное говно

onairika

Эх чего не сделаешь за деньги

onairika

кстати реально а чо там с this?

pulmo

да, теперь стало 16, это меня устраивает.
Кстати, вот это будет работать так как я думаю?
if (A[i2-1].id > i2-1)
{
memcpy(&B[i2],&B[i2-1]A[i2-1].id - i2-1)*sizeof(CAdditional;
}

в смысле я хочу передвинуть на 1 элемент несколько подряд идущих элементов массива типа класс...

ol4a21

>да, теперь стало 16, это меня устраивает.
уберешь виртуальный деструктор - станет 12
копировать объекты с помощью memcpy, имхо, дурной тон
а зачем такие извращения?

onairika

Да изврат однако

pulmo

а как тода мне это сделать?(в смысле сместить несколько элементов массива, не тупым же копированием по 1му элементу)
>а зачем такие извращения?
какие извращения? перемещать? это оптимизирует последующие действия, объяснять которые лучще устно т.к. очень долго

SmeX

DOUBLE =8 байт
long int = 8 байт
указатели на функции конструктора и деструктора по 4 байта
Итого 24 байта

bobking

> long int = 8 байт

ol4a21

>указатели на функции конструктора и деструктора по 4 байта

pulmo

эта проблема уже решена, пайн киллер убил мою боль теперь и правда стало 12 (и зачем мне этот деструктор теперь вопрос в другом как без memcpy эффективно сместить элементы...

Coffin

вот такими изподвыподвертами плодятся глюки...

kia88

По одному.

pulmo

ты по существу давай, нечего тут флудить

то Вика:
>в смысле сместить несколько элементов массива, не тупым же копированием по 1му элементу

bobking

Избавься от смещения вовсе.

Coffin

я вполне серъёзно
ты химичишь, вместо того что б использовать стандартные средства предоставляемые языком
как будто ты сможешь оптимизировать лучше компилятора
кстати не факт что твоя полученая програма будет "компиляторонезависима"

pulmo

>это оптимизирует последующие действия, объяснять которые лучще устно т.к. очень долго
товарищи читайте пожалуйста внимательнее и отвечайте по существу

bobking

Ты хочешь сказать, что ты умный, но в другом месте?

pulmo

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

>Ты хочешь сказать, что ты умный, но в другом месте?
Ты хочешь сказать что лучше меня знаешь как оптимизировать мою прогу?

bobking

Я предпочитаю избыток информации.

pulmo

какой нах избыток? ты хочешь чтоб я весь код привел?

tmp = B[A[i2-1].id];
if (A[i2-1].id > i2-1)
{
memcpy(&B[i2],&B[i2-1]A[i2-1].id - (i2-1*sizeof(CAdditional;
B[i2-1] = tmp;
}

легче стало?
Я спрашиваю как это написать столь же ЭФФЕКТИВНО но без мемкопи?

ol4a21

не нервничай
в принципе, можно и так, наверно, хотя мне не нравица
только лучше юзать не memcpy, а memmove (потому как первая предполагает, что копируемые регионы не перекрываются, и (теоретически) может быть устроена не так, как ты ожидаешь)
я бы сделал в цикле по одному
а подумал как лучше потом, когда всё остальное работало бы

pulmo

ну вот, человеческий ответ, сразу бы так, осталось разобраться как работает memmove , хотя, наверное сделаю так как ты говоришь.

ps: всегда хочется как лучше и чтоб сразу

то анонимус: а глядя на код понятно что он делает перемещает элемент массива на другую позицию, смещая остальные

bobking

Мля, на кой хер мне твой код?! Задачу поясни, которую он призван решить.

bobking

Маза у тебя эта хренотень в цикле? Если так, то попробуй сдвиг (реальный) вынести за этот самый цикл.

pulmo

нет эта хренотень не в цикле, она делается один раз, после чего идет цикл по всем элементам кроме одного(какраз того который переместили) это экономит либо по одному сравнению на каждый элемент либо разбитие этого массива на несколько поддиапазонов по которым будут циклы, опять же это приводит в куче доп. кода и проверок, там будет еще больше путаницы, поэтому был выбран этот вариант.
Спасибо всем, особенно убирателю боли

ol4a21

Если я правильно понял -
Так тебе n сравнений (индекса) сделать, а так порядка n копирований (объектов)
Сравнения дешевле обойдутся

И воообще, если уж ты такой маньяк, то маза на 2 цикла разбить
И, кстати, отличный повод на ассемблер перейти

Dasar

Копировать массивы через memcpy/memmove - это экономия на спичках, которая обычно выходит боком
если размеры копируемых массивов маленькие, то полученная экономия не стоит и выеденного яйца
а если размеры копируемых массивов большие, то значит у тебя не оптимальный алгоритм работы программы, и можно сделать лучше без такого копирования массивов.

pulmo

далее и так будет 2 цикла, вместо 5ти 6ти... а насчет эффективности это мы еще проверим

Dasar

я верю, что если писать программу на asm-е (использовать memcpy то она будет в простых случаях быстрее на 10%, в сложных случаях у тебя на asm-е (при использованиии memcpy) не получится написать серьезный алгоритм.
так вот насчет 10% в простых случаях, а оно того стоит?

pulmo

один хрен тогда надо цикл ставить думаешь это проще?
ИМХО если и проще то не на много а 10% все-таки...

Dasar

если лень писать for, то так напиши:
std::copy (&B[i2], &B[A[i2 - 1].id], &B[i2-1]);

pulmo

выглядит круто, а как это работает? что есть std::copy

std::copy (&B[i2], &B[A[i2 - 1].id], &B[i2-1]);
и
for (i = A[i2-1].id; i > i2-1; i--)
{
B = B[i-1];
}
одно и то же?

Dasar

а хелп посмотреть? В vc6 такой хороший msdn. тебе нужно, что-то типа "copy method"
в двух словах - это шаблонная типизированная функция, которая занимается копированием данных из одного места в другой.

pulmo

да есть у меня мсдн, мать его, водишь ему search copy method а он радостный находит все где сперва methods есть... и все в таком духе, а на std::copy вообще такое показывает

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

ol4a21



// TEMPLATE FUNCTION copy
template<class _II, class _OI> inline
_OI copy(_II _F, _II _L, _OI _X)
{for (; _F != _L; ++_X, ++_F)
*_X = *_F;
return (_X); }


ol4a21

Про MSDN: надо юзать не серч, а индекс по подмножеству "C/C++ Languages and C++ Libraries"

pulmo

тогда уж так:
copy
template<class InIt, class OutIt>
OutIt copy(InIt first, InIt last, OutIt x);
The template function evaluates *(x + N) = *(first + N once for each N in the range [0, last - first for strictly increasing values of N beginning with the lowest value. It then returns x + N. If x and first designate regions of storage, x must not be in the range [first, last).

ol4a21


маза я в курсе, что про неё в мсдне написано
я тебе исходник её из того STL, который с Вижуалом поставляеца (уж не знаю чей) запостил
чтоб ты понял, чем она от цикла отличается
Оставить комментарий
Имя или ник:
Комментарий: