
Zorro
02.10.2018
14:58:18
> компильтайм и рантайм код это разный код
Код будет везде рантайм, нужно один и тот же код (как можно большую его часть) использовать в параметризованном constexpr контексте, или без оного (визуально циклы выглядят как for(int i=0; i<n; i++) )
сломать глаза = вводить дополнительные внутренние классу dummy-классы, которые нужны чтобы угодить богу template-driven programming

Aidar
02.10.2018
14:59:37
выбор аргумента шаблона это компильтайм код
выбор аргумента функции это рантайм код

Google

Zorro
02.10.2018
14:59:51
у меня там case будет жеж, я написал

Aidar
02.10.2018
15:00:30
рантайм кейс? зачем тогда компильтайм аргумент

Alexander Alprog
02.10.2018
15:00:40
тебе нужен constexpr

Aidar
02.10.2018
15:00:46
ему ваще ниче не нужно

Zorro
02.10.2018
15:00:48
перфоманса ради внутре tight loops
Alexander Alprog я уже заменил в своих инклудах #define на constexprr, но все равно инклудами не то.

Aidar
02.10.2018
15:01:58
ты из 96го?

Zorro
02.10.2018
15:02:11
ну ты блин Айдар
#define INSIDE_INCLUDE 1
K join_sparse_2_tpl_2(K lists) {
constexpr int MAXCOLS = 2;
constexpr int ncols = 2;
#include "merge_join_sparse.inc.cc"
}
K join_sparse_2_tpl_64(K lists) {
constexpr int MAXCOLS = 64;
const int ncols = lists->n;
#include "merge_join_sparse.inc.cc"
}
#undef INSIDE_INCLUDE
так щас выглядит инстанциация

Aidar
02.10.2018
15:03:11
че жэто ща говнень пздц

Alexander Alprog
02.10.2018
15:04:17
че то ты очень плохо объясняешь, что ты хочешь
я сдаюсь

Google

Zorro
02.10.2018
15:04:32
хочу то же, но без инклудов, но с шаблонами

Aidar
02.10.2018
15:05:05
он типа хочет констекспр функцию на самом деле но это не имеет смысла потомучто констекспр функции имеют смысл только в компильтайм контексте при передаче аргумента в шаблон иначе компилятор всеравно соптимайзит

Zorro
02.10.2018
15:06:07
ув. Айдар, у меня внутре for(i=0..n). Во первом случае компилятор мне ее развернет, а во втором - нет.
Еще у меня case, который в зависимости от lists->n вызывает одну функцию или другую.

Alexander Alprog
02.10.2018
15:06:55

Zorro
02.10.2018
15:06:55
в этом виде оно уже оптимально компилится, но я хочу перфектности еще на уровне языка.

Aidar
02.10.2018
15:06:57
компилятор умнее программиста

Alexander Alprog
02.10.2018
15:07:22
поскольку параметр шаблона компайлтайм - всё будет ок

Zorro
02.10.2018
15:07:29
айдар, возможно умнее кого-то, но в этом случае это я компилятору помогаю.

Alexander Alprog
02.10.2018
15:07:47
а для общей специализации сделать вызов обычной функции от n, которая уже в свою очередь позовёт constexpr

Zorro
02.10.2018
15:08:01
Alexander Alprog я знаю как это сделать, вопрос как реюзать код для самой функции в контексте шаблона и не-шаблона.
... без инклудов

Aidar
02.10.2018
15:08:41
хорошо следи за руками
constexpr auto foo(int) {...}
auto func1(bar a){
return foo(a->i);
}
constexpr auto func2(bar a){
return foo(2);
}

Alexander Alprog
02.10.2018
15:08:43
просто вызывай constexpr функцию из шаблона и не из шаблона

Aidar
02.10.2018
15:09:23
можно код кишков?
пж

Zorro
02.10.2018
15:09:29
все. Вот теперь спасибо обоим. Этот вариант я не продумал.

Aidar
02.10.2018
15:09:32
того что внутри include
я почти уверен что тут константа ничего не даст потомучто внутри юзается list

Zorro
02.10.2018
15:10:05
я еще посмотрю, будет ли он специализировать эту двойку (как инлайн) или нет.

Google

Aidar
02.10.2018
15:10:18
да твоюжмать
ойвсе

Zorro
02.10.2018
15:10:48
я из 96-го, да

Aidar
02.10.2018
15:11:16
вы ваще представляете себе что инлайнинг иногда вреден нет?
тем более один инт лучше хранить в регистре а не в коде кажется это меньше места

Zorro
02.10.2018
15:11:59
мне не нужен инлайнинг, мне нужна специализация.

Aidar
02.10.2018
15:12:21
у вас ваще 2 скопипасченых функции что вы хотите специализировать

Zorro
02.10.2018
15:12:24
не нужен инлайнинг ради инлайининга
с инклудами - да.

Aidar
02.10.2018
15:14:17
вы делаете типа
foo<int A>(l){
return fbar(A, l);
}
bar(int A, l){
return fbar(A+10, l);
}
switch(test(l)){
case 1: foo<1 > (l)
case 2: bar(2, l)
}

Zorro
02.10.2018
15:30:14
чото не работает. Возможно я упустил какой-то нюанс.
#include<stdio.h>
#include<stdlib.h>
static constexpr auto foo(int i) {
int s = 0;
int *m = (int*)malloc(i*sizeof(int));
for(int j=0; j<i; j++) m[j] = j;
for(int j=0; j<i; j++) s += m[j];
printf("debug: %d\n",s);
free(m);
return s;
}
int main(int ac, char **av) {
int z=rand() % 0xFF;
printf("%d\n",foo(3));
printf("%d\n",foo(z));
}
В результате имеем один экземпляр функции, в которой цикл не развернут. Вызывается один раз с тройкой, вторая тоже с аргументом.
Мне нужно: чтобы когда я пишу тройку, чтобы существовал и выполнялся код с развернутым циклом.


Igor
02.10.2018
15:30:38
мне не нужен инлайнинг, мне нужна специализация.
специализация это всё же больше про то, что foo(T x) { /*медленная но всегда работающая оптимизация*/ }; foo (int x) { /*куча оптимизаций для целых чисел, и функция работает в 10050 раз быстрее*/*/
а есть бенчмарки, которые говорят что действительно при foo<5>() циклы разворачиваются и функция работает ощутимо быстрее чем при foo(5)?

Aidar
02.10.2018
15:31:03

Igor
02.10.2018
15:31:35

Aidar
02.10.2018
15:31:40
я же сказал что компильтайм i-параметр-шабона и рантайм-i-переменная это лексически разный код

Zorro
02.10.2018
15:31:46
у меня параметр используется внутре в куче формул, перфоманс там будет точно.
мне не нужен компайл тайм
мне нужна специализация.

Aidar
02.10.2018
15:32:07
БЛДЖАД ВЫ ХОТИТЕ КОМПИЛЬТАЙМ i же
пишите 2 реализации

Google

Zorro
02.10.2018
15:32:20
нет жеж.
я не хочу 2 реализации

Igor
02.10.2018
15:32:29
по другому никак

Aidar
02.10.2018
15:32:33
а как компиль развернет вам?

Zorro
02.10.2018
15:32:40
у меня с инклудами УЖЕ работает так как надо.
хочу теперь без инклудов.

Igor
02.10.2018
15:32:53
не получится

Aidar
02.10.2018
15:33:11
получится но 2 реализации цикла

Admin
ERROR: S client not available

Igor
02.10.2018
15:33:15
варианта устранения дубликации лучше чем с инклюдами быть не может

Zorro
02.10.2018
15:33:44
айдар: ты просто хочешь сказать, что современный С++ не предлагает иных способов. Не нужно нервничать, это не страшно.

Igor
02.10.2018
15:33:51
разве что какие-нибудь constexpr параметры функций, запланированные на C++23 и далее

Aidar
02.10.2018
15:34:03
я хочу сказать что современный си++ в отличие от симакросов лексически строг

Zorro
02.10.2018
15:34:07
игорь, вот сюда я и копал, вдруг что есть уже.

Igor
02.10.2018
15:34:16
ещё нет но обсуждалось

Zorro
02.10.2018
15:34:19
айдар: я в курсе

Aidar
02.10.2018
15:34:29
тут есть кнопка ответить

Zorro
02.10.2018
15:34:44
а как проще?
где эта кнопка на клавиатуре, айдар?

Google

Igor
02.10.2018
15:35:12
пкм по сообщению и Reply )
а как там в терминальных вимообразных телеграммах без мыши - хз

Zorro
02.10.2018
15:35:29
у меня нет пкм, точнее она лежит, я за ней не тягаюсь
я в гуе без мыши, где можно.

Aidar
02.10.2018
15:36:07
зачем тогда в гуе

Zorro
02.10.2018
15:36:39
потому что нафига мне вим, меня устраивает и телеграм и ники писать руками, когда есть два собеседника.

Aidar
02.10.2018
15:37:02
меня не устраивает

Zorro
02.10.2018
15:37:34
ок, я закруглился. Всем спасибо за содержательную помошь.

Aidar
02.10.2018
15:37:35
констекспр параметры не помогут
потомучто это тоже лексически не отделяет рантайм от компильтайм переменной
вам могут помочь только симакросы

Mackenlly
02.10.2018
15:41:11
Кто писал алгоритм сжатия LZ77?

yuri
02.10.2018
15:45:56
Лемпель и Зив?

Ioann V
02.10.2018
15:46:55
эй, ребята, подскажите:
declval<F>() (declval<Args>()... )
зачем нужен деклвал у аргс?

Aidar
02.10.2018
15:47:32
чтоб псевдовызвать если нет конструктора по умолчанию у Args

Igor
02.10.2018
15:47:33
констекспр параметры не помогут
void fun(constexpr int n) { for (i=0; i<n; ++i) printf(i); } // определение должно быть видимо при сборке
fun(3); // может развернуться в printf(0); printf(1); printf(2); если компилятор посчитает нужным
fun(n); // будет честно крутить цикл
не?

Aidar
02.10.2018
15:48:08
и нифига компиль не развернет потомучто врятли он сделает из 1 функции 2
если он решит заинлайнить он ее и без этого заинлайнит и развернет

Igor
02.10.2018
15:50:18
"сделает из 1 функции 2" в плане раздувания кода и создания двух отдельных реализаций, с развернутым циклом и с неразвернутым?

Aidar
02.10.2018
15:50:45
да, он же это хотел