cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить тернарный оператор целочисленного деления #515

Closed exldna closed 2 years ago

exldna commented 2 years ago

Довольно часто при делении целых чисел надо получить не только их частное, но и остаток деления. Приходится писать что-то вроде:

// . . .
int x = a / b;
int y = a % b;
//  . . .

Процессоры i386+ находят оба значения за одну (довольно сложную, дорогостоящую) инструкцию, но у компиляторов не всегда есть все необходимые данные для разбора таких случаев. В результате может сгенерироваться примерно следующий код:

; Оптимизирующий компилятор Microsoft (R) C/C++ версии 19.31.31105 для x86 с флагами /EHs /O2
; . . .
mov eax, ecx
cdq
idiv    esi
mov BYTE PTR _buf$[esp+12], al

mov eax, ecx
cdq
idiv    esi
mov BYTE PTR _buf$[esp+13], dl
; . . .

Процессор дважды считает одну инструкцию, а программисты пишут две почти одинаковых строчки кода. Обе проблемы можно решить добавлением нового тернарного оператора. Вот пример возможного синтаксиса:

int  y, x = a / b : y;

Это позволит нам писать более простой и понятный код, а компиляторам - быть немного оптимальней.

исходный код примера:

# include <Windows.h>

int main() {
    int* a = new int{10};
    int* b = new int{3};

    int c = *a / *b;
    int d = *a % *b;

    char buf[2];
    buf[0] = '0' + c;
    buf[1] = '0' + d;

    HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    WriteConsole(stdout, buf, 2, nullptr, NULL);
}
Smertig commented 2 years ago

Уже есть std::div

exldna commented 2 years ago

спасибо, буду пользоваться