
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

Spoonson
12.07.2018
09:33:58

Ilia
12.07.2018
09:34:15

Александр
12.07.2018
09:35:09

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

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

Alexander
12.07.2018
09:36:24
небось без march=native

Ilia
12.07.2018
09:37:52

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

Alexander
12.07.2018
09:38:33

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

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

Spoonson
12.07.2018
09:58:36

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

Spoonson
12.07.2018
10:02:53

Anatoly
12.07.2018
10:02:55


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

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

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

Ilia
12.07.2018
10:36:02

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

Ilia
12.07.2018
10:37:00

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?