почему такой sizeof?
напиши #pragma pack(1)
не, чето я не то написал %)
не, чето я не то написал %)
а где это писать? я это радом с инклудами поставил и толку никакого
что почему-то?
sizeof(double) + sizeof(unsigned long) == 8 + 4 == 12, все тут ок.
sizeof(CAdditional) == sizeof(double) + sizeof(unsigned long) + 3 указателя(конструктор, деструктор, this) == 24, тоже вроде все ок...
sizeof(double) + sizeof(unsigned long) == 8 + 4 == 12, все тут ок.
sizeof(CAdditional) == sizeof(double) + sizeof(unsigned long) + 3 указателя(конструктор, деструктор, this) == 24, тоже вроде все ок...
а если я массив таких штук хочу сделать то оно будет 24*NomberOfElements? как-то глупо это выглядит, зачем мне скажем 10000 одинаковых конструкторов? что struct юзать чтоли?
Без паники.
Конструкторы и прочие там методы никакого места не занимают, так же как и статические члены.
Зайди в Project->Settings->C/C++->Code Generation и поставь Struct Member Alignment в 1byte и посмотри что получица
Кроме выравнивания, может потеряться память только еще на vtbl-указатель
Конструкторы и прочие там методы никакого места не занимают, так же как и статические члены.
Зайди в Project->Settings->C/C++->Code Generation и поставь Struct Member Alignment в 1byte и посмотри что получица
Кроме выравнивания, может потеряться память только еще на vtbl-указатель
Плюсы говно
>Struct Member Alignment в 1byte
#pragma pack(1) - это ровно оно же
Ты хочешь сказать, что в экземпляре класса нет указателей на его членофункции? но тогда на vtbl его тоже не должно быть.
но this-то там должен быть...
#pragma pack(1) - это ровно оно же
Ты хочешь сказать, что в экземпляре класса нет указателей на его членофункции? но тогда на vtbl его тоже не должно быть.
но this-то там должен быть...
>Ты хочешь сказать, что в экземпляре класса нет указателей на его членофункции? но тогда на vtbl его тоже не должно быть.
а зачем? они что, у разных экземпляров класса разные?
а вот на втбл (или аналог) он нужен, на этом весь плюсовый полиморфизм построен
>но this-то там должен быть...
ggggg
2
всё - говно
но что поделаешь, если сейчас это модное говно
а зачем? они что, у разных экземпляров класса разные?
а вот на втбл (или аналог) он нужен, на этом весь плюсовый полиморфизм построен
>но this-то там должен быть...
ggggg
2
всё - говно
но что поделаешь, если сейчас это модное говно
Эх чего не сделаешь за деньги
кстати реально а чо там с this?
да, теперь стало 16, это меня устраивает.
Кстати, вот это будет работать так как я думаю?
if (A[i2-1].id > i2-1)
{
memcpy(&B[i2],&B[i2-1]A[i2-1].id - i2-1)*sizeof(CAdditional;
}
в смысле я хочу передвинуть на 1 элемент несколько подряд идущих элементов массива типа класс...
Кстати, вот это будет работать так как я думаю?
if (A[i2-1].id > i2-1)
{
memcpy(&B[i2],&B[i2-1]A[i2-1].id - i2-1)*sizeof(CAdditional;
}
в смысле я хочу передвинуть на 1 элемент несколько подряд идущих элементов массива типа класс...
>да, теперь стало 16, это меня устраивает.
уберешь виртуальный деструктор - станет 12
копировать объекты с помощью memcpy, имхо, дурной тон
а зачем такие извращения?
уберешь виртуальный деструктор - станет 12
копировать объекты с помощью memcpy, имхо, дурной тон
а зачем такие извращения?
Да изврат однако
а как тода мне это сделать?(в смысле сместить несколько элементов массива, не тупым же копированием по 1му элементу)
>а зачем такие извращения?
какие извращения? перемещать? это оптимизирует последующие действия, объяснять которые лучще устно т.к. очень долго
>а зачем такие извращения?
какие извращения? перемещать? это оптимизирует последующие действия, объяснять которые лучще устно т.к. очень долго
DOUBLE =8 байт
long int = 8 байт
указатели на функции конструктора и деструктора по 4 байта
Итого 24 байта
long int = 8 байт
указатели на функции конструктора и деструктора по 4 байта
Итого 24 байта
> long int = 8 байт

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

эта проблема уже решена, пайн киллер убил мою боль
теперь и правда стало 12 (и зачем мне этот деструктор
теперь вопрос в другом как без memcpy эффективно сместить элементы...
вот такими изподвыподвертами плодятся глюки...
По одному.
ты по существу давай, нечего тут флудить
то Вика:
>в смысле сместить несколько элементов массива, не тупым же копированием по 1му элементу
то Вика:
>в смысле сместить несколько элементов массива, не тупым же копированием по 1му элементу
Избавься от смещения вовсе.
я вполне серъёзно
ты химичишь, вместо того что б использовать стандартные средства предоставляемые языком
как будто ты сможешь оптимизировать лучше компилятора
кстати не факт что твоя полученая програма будет "компиляторонезависима"
ты химичишь, вместо того что б использовать стандартные средства предоставляемые языком
как будто ты сможешь оптимизировать лучше компилятора
кстати не факт что твоя полученая програма будет "компиляторонезависима"
>это оптимизирует последующие действия, объяснять которые лучще устно т.к. очень долго
товарищи читайте пожалуйста внимательнее и отвечайте по существу
товарищи читайте пожалуйста внимательнее и отвечайте по существу
Ты хочешь сказать, что ты умный, но в другом месте? 
мне надо написать достаточно эффективную прогу, которая будет компилироваться на VC6, то что я пишу точно компилируется, а вот корректность я и просил уточнить
>Ты хочешь сказать, что ты умный, но в другом месте?
Ты хочешь сказать что лучше меня знаешь как оптимизировать мою прогу?
>Ты хочешь сказать, что ты умный, но в другом месте?
Ты хочешь сказать что лучше меня знаешь как оптимизировать мою прогу?
Я предпочитаю избыток информации.
какой нах избыток? ты хочешь чтоб я весь код привел?
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;
}
легче стало?
Я спрашиваю как это написать столь же ЭФФЕКТИВНО но без мемкопи?
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;
}
легче стало?
Я спрашиваю как это написать столь же ЭФФЕКТИВНО но без мемкопи?
не нервничай
в принципе, можно и так, наверно, хотя мне не нравица
только лучше юзать не memcpy, а memmove (потому как первая предполагает, что копируемые регионы не перекрываются, и (теоретически) может быть устроена не так, как ты ожидаешь)
я бы сделал в цикле по одному
а подумал как лучше потом, когда всё остальное работало бы
в принципе, можно и так, наверно, хотя мне не нравица
только лучше юзать не memcpy, а memmove (потому как первая предполагает, что копируемые регионы не перекрываются, и (теоретически) может быть устроена не так, как ты ожидаешь)
я бы сделал в цикле по одному
а подумал как лучше потом, когда всё остальное работало бы
ну вот, человеческий ответ, сразу бы так, осталось разобраться как работает memmove
, хотя, наверное сделаю так как ты говоришь.
ps: всегда хочется как лучше и чтоб сразу
то анонимус: а глядя на код понятно что он делает
перемещает элемент массива на другую позицию, смещая остальные
ps: всегда хочется как лучше и чтоб сразу
то анонимус: а глядя на код понятно что он делает
Мля, на кой хер мне твой код?! Задачу поясни, которую он призван решить.
Маза у тебя эта хренотень в цикле? Если так, то попробуй сдвиг (реальный) вынести за этот самый цикл.
нет эта хренотень не в цикле, она делается один раз, после чего идет цикл по всем элементам кроме одного(какраз того который переместили) это экономит либо по одному сравнению на каждый элемент либо разбитие этого массива на несколько поддиапазонов по которым будут циклы, опять же это приводит в куче доп. кода и проверок, там будет еще больше путаницы, поэтому был выбран этот вариант.
Спасибо всем, особенно убирателю боли
Спасибо всем, особенно убирателю боли
Если я правильно понял -
Так тебе n сравнений (индекса) сделать, а так порядка n копирований (объектов)
Сравнения дешевле обойдутся
И воообще, если уж ты такой маньяк, то маза на 2 цикла разбить
И, кстати, отличный повод на ассемблер перейти

Так тебе n сравнений (индекса) сделать, а так порядка n копирований (объектов)
Сравнения дешевле обойдутся
И воообще, если уж ты такой маньяк, то маза на 2 цикла разбить
И, кстати, отличный повод на ассемблер перейти
Копировать массивы через memcpy/memmove - это экономия на спичках, которая обычно выходит боком
если размеры копируемых массивов маленькие, то полученная экономия не стоит и выеденного яйца
а если размеры копируемых массивов большие, то значит у тебя не оптимальный алгоритм работы программы, и можно сделать лучше без такого копирования массивов.
если размеры копируемых массивов маленькие, то полученная экономия не стоит и выеденного яйца
а если размеры копируемых массивов большие, то значит у тебя не оптимальный алгоритм работы программы, и можно сделать лучше без такого копирования массивов.
далее и так будет 2 цикла, вместо 5ти 6ти... а насчет эффективности это мы еще проверим 
я верю, что если писать программу на asm-е (использовать memcpy то она будет в простых случаях быстрее на 10%, в сложных случаях у тебя на asm-е (при использованиии memcpy) не получится написать серьезный алгоритм.
так вот насчет 10% в простых случаях, а оно того стоит?
так вот насчет 10% в простых случаях, а оно того стоит?
один хрен тогда надо цикл ставить думаешь это проще?
ИМХО если и проще то не на много а 10% все-таки...
ИМХО если и проще то не на много а 10% все-таки...
если лень писать for, то так напиши:
std::copy (&B[i2], &B[A[i2 - 1].id], &B[i2-1]);
std::copy (&B[i2], &B[A[i2 - 1].id], &B[i2-1]);
выглядит круто, а как это работает? что есть 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];
}
одно и то же?
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];
}
одно и то же?
а хелп посмотреть? В vc6 такой хороший msdn. тебе нужно, что-то типа "copy method"
в двух словах - это шаблонная типизированная функция, которая занимается копированием данных из одного места в другой.
в двух словах - это шаблонная типизированная функция, которая занимается копированием данных из одного места в другой.
да есть у меня мсдн, мать его, водишь ему search copy method а он радостный находит все где сперва methods есть... и все в таком духе, а на std::copy вообще такое показывает
а пошло оно все... пусть будет цикл, утром разберусь
а пошло оно все... пусть будет цикл, утром разберусь
// 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); }
Про MSDN: надо юзать не серч, а индекс по подмножеству "C/C++ Languages and C++ Libraries"
тогда уж так:
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).

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).

маза я в курсе, что про неё в мсдне написано
я тебе исходник её из того STL, который с Вижуалом поставляеца (уж не знаю чей) запостил
чтоб ты понял, чем она от цикла отличается
Оставить комментарий
pulmo
class CAdditional{
public:
double z;
unsigned long id;
CAdditional;
virtual ~CAdditional;
};
sizeof(CAdditional) ==24
sizeof(double) + sizeof(unsigned long) = 12
почему?