@ProCxx

Страница 2194 из 2477
Pavel
12.07.2018
09:09:38
как нынче делают выровненный вектор?

аллокатор свой пишут досихпор?

Antony
12.07.2018
09:10:29
аллокатор свой пишут досихпор?
Ипользуют бустовый аллокатор

Pavel
12.07.2018
09:10:37
а если буст не хочу?

Google
Antony
12.07.2018
09:10:55
Тогда придётся страдать

Maksym
12.07.2018
09:11:08
как нынче делают выровненный вектор?
выровненный это когда капасити == сайз?

Pavel
12.07.2018
09:11:29
Maksym
12.07.2018
09:11:52
а, понял

Spoonson
12.07.2018
09:14:48
в 17 плюсах вроде же появились выровненные версии new и прочее?

Ilia
12.07.2018
09:14:51
Не понимаю ваши проблемы...

Pavel
12.07.2018
09:24:51
я думал щас тяп ляп проверю этот новый djbsort

а он мне своим avx2 всю память похоже переворачивает. malloc(): memory corruption в непонятных местах получается

Alexander
12.07.2018
09:25:48
Ага

Там у ребят вообще веселье

И чот мне подсказывает, что его сортировка не так феноменальна, как он говорит по сравнению хотя б с тем же pdqsort

Ilia
12.07.2018
09:27:53
А как вы умудряетесь выделить невыровненные данные в vector?

Pavel
12.07.2018
09:32:00
Google
Pavel
12.07.2018
09:32:38
я заюзал бустовый аллокатор. всёравно падает. может не изза выравнивания дело

Ilia
12.07.2018
09:33:05
Ну вот что нужно проделать, чтобы получить в векторе невыровненные данные?

Pavel
12.07.2018
09:33:17
у него там есть 4 портабельных реализации без авх, медленные все

Ilia
12.07.2018
09:33:29
А вообще без аллокатора?

Александр
12.07.2018
09:33:49
Ну вот что нужно проделать, чтобы получить в векторе невыровненные данные?
видимо, выравнивание sizeof(T), а нужно какой-нибудь sizeof(T)*4 для всяких avx (предположение)

Spoonson
12.07.2018
09:33:58
Ну вот что нужно проделать, чтобы получить в векторе невыровненные данные?
если нужно выравнивание побольше чем стандартное 16 в аллокаторе, то можно и получить

Александр
12.07.2018
09:35:09
AVX это что?
https://ru.wikipedia.org/wiki/AVX

Ilia
12.07.2018
09:36:02
ОК, понял. А почему там нужно большее выравнивание?

Spoonson
12.07.2018
09:36:21
потому что этого требует процессор ?

Alexander
12.07.2018
09:36:24
у него там есть 4 портабельных реализации без авх, медленные все
а как ты определяешь, что медленные? как компиляешь?

небось без march=native

Ilia
12.07.2018
09:37:52
потому что этого требует процессор ?
Так я и спрашиваю, почему требует

Pavel
12.07.2018
09:38:04
небось без march=native
у меня есть древнючий проект который генерит рандом и скармливает всяким алгоритмам. там и замеры несколько раз и генерация несколько раз и march=native и -Ofast и даже cuda есть

Pavel
12.07.2018
09:38:38
ага

Alexander
12.07.2018
09:38:43
а ссыль моно?

Pavel
12.07.2018
09:39:00
https://github.com/yekm/bench

Spoonson
12.07.2018
09:39:28
Так я и спрашиваю, почему требует
тут уж можно спрашивать почему вообще требует выровненные данные (ну точнее почему для них быстрее для x86). Быстрее потому что наверное выходит.

Pavel
12.07.2018
09:39:47
4 года уже прошло. как быстро время летит..

Google
Alexander
12.07.2018
09:43:14
закинул issue в cpp_sort - мб через пару дней Морвенн добавит в свлю либу эту сортировку, тогда можно будет нормально юзать

Antony
12.07.2018
09:45:19
А как вы умудряетесь выделить невыровненные данные в vector?
До C++17 new не умел правльно работать с overaligned данными. Тоесть если у вас есть тип данных с alignas(64), а вот std::max_align у вас 16, то new выделял с alignment 16

Pavel
12.07.2018
09:56:02
pdqsort всех обогнал

Fuzzytoozy
12.07.2018
10:01:54
std::max_align_t - cppreference.com https://en.cppreference.com/w/cpp/types/max_align_t

Anatoly
12.07.2018
10:02:55
а что такое std::max_align? что-то не гуглится
а вот здесь пример https://en.cppreference.com/w/cpp/types/aligned_storage

Andriy
12.07.2018
10:04:05
Добрый день, коллеги! Разбираюсь с таблицами виртуальных функций в классах. Вроде, все ясно, но решил сам подебажить-посмотреть. Так вот, наткнулся на непонятку. Код ниже. Дебагер VS не показывает адрес метода C::cf для объекта с. Вопрос, куда реально запихивается адрес метода C::cf для объекта с? Табл для с нет вообще, а табл родителя A только af, родителя B только bf. class A { public: virtual void af() { std::cout << "A::af()" << std::endl; }; int a; }; class B { public: virtual void bf() { std::cout << "B::bf()" << std::endl; }; int b; }; class C : public A, public B { public: virtual void cf() { std::cout << "C::cf()" << std::endl; }; int c; }; int main() { A a; B b; C c; int s_a = sizeof(a); // 8 = sizeof(int) + sizeof(__vfptr) int s_b = sizeof(b); // 8 = sizeof(int) + sizeof(__vfptr) int s_c = sizeof(c); // 20 = sizeof(A) + sizeof(B) + sizeof(int) int stop = 123; return 0; }

Предполагаю, что адрес прописывается в талицу первого родителя, а VS просто не отображает. Такая теория сходится и со сайзофом.

Alexander
12.07.2018
10:07:11
pdqsort всех обогнал
даже эту хвалёную сортировку с AVX2?

Pavel
12.07.2018
10:07:32
avx2 пока не победил

Alexander
12.07.2018
10:07:44
а сколько отставание? раз

в раза 2-3 наверное

Pavel
12.07.2018
10:09:31
http://yekm.github.io/bench/i7arch.html

4-5 графики

хм, я вроде гдето писал чтобы видно было во сколько там один от другого отстает

ну, значит не писал :)

28/14, ну в 2 раза получается, да

Alexander
12.07.2018
10:13:23
ну в два раза неплохо, да

имеет наверное смысл юзать где-то, где сортировка критична

Google
Pavel
12.07.2018
10:15:46
ну djbsort похоже выполняет другую полезную для этих криптографов штуку — время выполнения не зависит от сортированности данных

ну, хоть её выполняет

5й график

Alexander
12.07.2018
10:16:11
да, и в статье это было указано

но мне бы больше хотелось, чтобы был вариант и без этого, когда сортировка завершается как можно быстрее

Anatoly
12.07.2018
10:23:28
Andriy
12.07.2018
10:29:03
у C нет своей переменной для хранения адреса таблицы виртуальных функций
а как же скрытая переменная __vfptr у экземпляра класса?

Anatoly
12.07.2018
10:29:23
Andriy
12.07.2018
10:32:09
Прошу прощения, фразу "у C нет своей..." не правильно понял.

она берется из предков

она берется из предков
то есть если есть иерархия 10 классов, что поочередно наследуются "младший" от "старшего". то во всей этой цепочке будет одна переменная адреса табл. вирт. методов? и все виртуальные методы будут записываться в нее, грубо говоря. Правильно?

Ilia
12.07.2018
10:35:00
она берется из предков
Она берётся из предков при линейном наследовании..

Серж
12.07.2018
10:35:47
http://www.drdobbs.com/cpp/multiple-inheritance-considered-useful/184402074

Alexander
12.07.2018
10:36:28
помню как-то видел кодяру, в которой было наследование от то ли 12, то ли 14 классов

Alexander
12.07.2018
10:37:02
причём большинство из них были разные шаблонные инстанциации одного и того же класса

Andriy
12.07.2018
10:42:11
Окей, тогда где, в какую таблице будет записан адрес вирт. метода класса C. если class C : public A, public B {...};

в табл своего первого предка, то есть класса А?

Ilia
12.07.2018
10:53:10
В таблицу класса C

Google
Mikhail Voronov
12.07.2018
10:59:27
В таблицу класса C
Которая будет состоять из 2 методов: af и cf. bf будет в отдельной таблице, т.к. в списке наследования он идет вторым

Ilia
12.07.2018
11:09:25
В таблицу класса C
Сори, ввёл в заблуждение наверное.... Я не посмотрел, что там множественное... У класса C будет несколько таблиц виртуальных методов, по одной на каждую линию наследования от своих предков. Тут будет две, для A и для B. Так что Михаил Воронов правильно говорит

Andriy
12.07.2018
11:13:43
Я понял, спасибо большое, ребята!

Антон
12.07.2018
11:29:59
template <typename T> class WDEdCBBitValidator : public wxValidator { T *val; T bitmask; public: WDEdCBBitValidator(T *val, T bitmask) : wxValidator(), val(val), bitmask(bitmask) { wxPrintf("Validator init\n"); }; virtual wxObject *Clone() const { wxPrintf("Validator Clone %p %p\n", m_validatorWindow, val); return new WDEdCBBitValidator<T>(*this); } // Called when the value in the window must be validated: this is not used // by this class virtual bool Validate(wxWindow * WXUNUSED(parent)) { return true; } // Called to transfer data to the window virtual bool TransferToWindow() override { wxPrintf("TransferToWindow %p %p\n", m_validatorWindow, val); if(!m_validatorWindow || !val) return false; wxCheckBox *cb = (wxCheckBox *) m_validatorWindow; cb->SetValue((*val & bitmask) ? true : false); return true; } // Called to transfer data from the window virtual bool TransferFromWindow() { wxPrintf("TransferFromWindow %p %p\n", m_validatorWindow, val); if(!m_validatorWindow || !val) return false; wxCheckBox *cb = (wxCheckBox *) m_validatorWindow; if(cb->GetValue()) { *val |= bitmask; } else { *val &= ~bitmask; } return true; } };

этот код не работает

Transfer(To/From)Window не вызывается

Renat
12.07.2018
11:38:05
Кто юзает Qt?

Страница 2194 из 2477