почему такой sizeof?
не, чето я не то написал %)
а где это писать? я это радом с инклудами поставил и толку никакого
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-указатель
Плюсы говно
#pragma pack(1) - это ровно оно же
Ты хочешь сказать, что в экземпляре класса нет указателей на его членофункции? но тогда на vtbl его тоже не должно быть.
но this-то там должен быть...
а зачем? они что, у разных экземпляров класса разные?
а вот на втбл (или аналог) он нужен, на этом весь плюсовый полиморфизм построен
>но this-то там должен быть...
ggggg
2
всё - говно
но что поделаешь, если сейчас это модное говно
Эх чего не сделаешь за деньги
кстати реально а чо там с this?
Кстати, вот это будет работать так как я думаю?
if (A[i2-1].id > i2-1)
{
memcpy(&B[i2],&B[i2-1]A[i2-1].id - i2-1)*sizeof(CAdditional;
}
в смысле я хочу передвинуть на 1 элемент несколько подряд идущих элементов массива типа класс...
уберешь виртуальный деструктор - станет 12
копировать объекты с помощью memcpy, имхо, дурной тон
а зачем такие извращения?
Да изврат однако
>а зачем такие извращения?
какие извращения? перемещать? это оптимизирует последующие действия, объяснять которые лучще устно т.к. очень долго
long int = 8 байт
указатели на функции конструктора и деструктора по 4 байта
Итого 24 байта
эта проблема уже решена, пайн киллер убил мою боль теперь и правда стало 12 (и зачем мне этот деструктор теперь вопрос в другом как без memcpy эффективно сместить элементы...
вот такими изподвыподвертами плодятся глюки...
По одному.
то Вика:
>в смысле сместить несколько элементов массива, не тупым же копированием по 1му элементу
Избавься от смещения вовсе.
ты химичишь, вместо того что б использовать стандартные средства предоставляемые языком
как будто ты сможешь оптимизировать лучше компилятора
кстати не факт что твоя полученая програма будет "компиляторонезависима"
товарищи читайте пожалуйста внимательнее и отвечайте по существу
Ты хочешь сказать, что ты умный, но в другом месте?
>Ты хочешь сказать, что ты умный, но в другом месте?
Ты хочешь сказать что лучше меня знаешь как оптимизировать мою прогу?
Я предпочитаю избыток информации.
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 (потому как первая предполагает, что копируемые регионы не перекрываются, и (теоретически) может быть устроена не так, как ты ожидаешь)
я бы сделал в цикле по одному
а подумал как лучше потом, когда всё остальное работало бы
ps: всегда хочется как лучше и чтоб сразу
то анонимус: а глядя на код понятно что он делает перемещает элемент массива на другую позицию, смещая остальные
Мля, на кой хер мне твой код?! Задачу поясни, которую он призван решить.
Маза у тебя эта хренотень в цикле? Если так, то попробуй сдвиг (реальный) вынести за этот самый цикл.
Спасибо всем, особенно убирателю боли
Так тебе n сравнений (индекса) сделать, а так порядка n копирований (объектов)
Сравнения дешевле обойдутся
И воообще, если уж ты такой маньяк, то маза на 2 цикла разбить
И, кстати, отличный повод на ассемблер перейти
если размеры копируемых массивов маленькие, то полученная экономия не стоит и выеденного яйца
а если размеры копируемых массивов большие, то значит у тебя не оптимальный алгоритм работы программы, и можно сделать лучше без такого копирования массивов.
далее и так будет 2 цикла, вместо 5ти 6ти... а насчет эффективности это мы еще проверим
так вот насчет 10% в простых случаях, а оно того стоит?
ИМХО если и проще то не на много а 10% все-таки...
std::copy (&B[i2], &B[A[i2 - 1].id], &B[i2-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];
}
одно и то же?
в двух словах - это шаблонная типизированная функция, которая занимается копированием данных из одного места в другой.
а пошло оно все... пусть будет цикл, утром разберусь
// 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).
маза я в курсе, что про неё в мсдне написано
я тебе исходник её из того STL, который с Вижуалом поставляеца (уж не знаю чей) запостил
чтоб ты понял, чем она от цикла отличается
Оставить комментарий
pulmo
class CAdditional{
public:
double z;
unsigned long id;
CAdditional;
virtual ~CAdditional;
};
sizeof(CAdditional) ==24
sizeof(double) + sizeof(unsigned long) = 12
почему?