- 1
- 2
- 3
- 4
- 5
- 6
__declspec(noreturn) int FastAdd(const int a, const int b)
{
__asm mov eax, a;
__asm mov ebx, b;
__asm add eax, ebx;
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+922.2
__declspec(noreturn) int FastAdd(const int a, const int b)
{
__asm mov eax, a;
__asm mov ebx, b;
__asm add eax, ebx;
};
Встречаеться множество подобных функций в одном С++ проекте, который в данный момент разгребаю. Хочеться что-нибудь сказать автору. Например: "на XYZ"?
asm
mov ax, a
mov bx, b
mov a, bx
mov b, ax
end;
Из памяти в память писать запрещено.
4 команды. А обычный обмен или через ксор делает 6 операций.
/* в случае a == b (указывают на один int) функция не работает */
assert(a != b);
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
a=5;
b=5;
То swap(a,b) приведёт к тому, что в a и b будут лежать нули?
Уж лучше тогда + и - использовать, чем такой не безопасный обмен...
i=5
j=5
то swap(a[i], a[j]) приведёт к двум нулям, даже если a[i] было вовсе не ноль.
a = a + b; // a = a + a;
b = a - b; // a = a - a;
a = a - b; // a = a - a;
void swap(int * a, int * b){
/* в случае a == b (указывают на один int) функция работает */
if(a == b)
return;
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
if(a == b)
return;
xchg ax, b
mov a, ax
Ну, померялись, дальше что? :)
размер кода не имеет значения еще со времен PPro...
mov %0, %ebx
Ничего в этом синтаксисе нет кросплатформенного.
подобным флагом обладает функция longjmp, exit, так как эти функции не возвращают управления... оптимизатор может выкинуть код идущий за этими функциями или кинуть варнинг...
гость выше написал почему это используется здесь...
недавно у нас был проект с такими же заморочками, но там ребята еще и были в курсе про __fastcall...
This __declspec attribute tells the compiler that a function does not return. As a consequence, the compiler knows that the code following a call to a __declspec(noreturn) function is unreachable.
If the compiler finds a function with a control path that does not return a value, it generates a warning (C4715) or error message (C2202). If the control path cannot be reached due to a function that never returns, you can use __declspec(noreturn) to prevent this warning or error.
И если не знал, то guest - не зарегистрированный пользователь. Под ним может сидеть кто угодно. ;)
Сделайте же с этим что-нибудь... Неужели сложно запретить Анонирование Анонимусов?
И ещё сам СтраусТруп говорит, что добиться полной совместимости С++ с Си не получилось. Можно встретить такие проги Си, что не скомпилятся С++ компилятором или скомпилятся не верно. Хотя сам такой пример привести врятли смогу.
Нормально компилируется и работает. P.S. на говнокоде не перевыкладывать писалось на коленке.
char arr[] = "qwerty";
arr[2] == 'e';
//массив можно привести к указателю. С указателями можно складывать числа:
*(arr+2)=='e';
//от перемены мест слагаемых сумма не меняется
*(2+arr) == 'e';
//возвращаемся к старому синтаксису
a[arr] == 'e';
2[arr] == 'e';
FIXED
Теперь коммент +2 виртуально имеет.
void f( const int n )
{
int mas[n];
.......
}
Проверьте, пожалуйста, правильность написания моих постов.
С Уважением
Антон, 25 лет
Так что сам не умничай.
А безграмотность лично меня бесит сильнее, чем любой говнокод.
Простите, не удержался
низащот
будим испровлаца
я так понимаю, что этот сумматор просто используется для каких-то стандартных алгоритмов... std::for_each или что-либо в этом же духе
экономилось время программиста...
при чём тут говнокод?
В раздел ассемблера это унылое не смешное говно. Ему место там.
Код, на который без улыбки не взглянешь?
Нет тут такого. Не смешно. Плакать хочеться.