Продублирую тут темку на лоре
http://www.linux.org.ru/view-message.jsp?msgid=3551085Задача: с минимальным оверхедом убедится в отсутствии переполнения целых при арифметических операциях.
Пока я решил так:
#define CHECK_OVERFLOW(flag) asm (\
"jno nooverflow;"\
"mov $0x1,%0;"\
"nooverflow :"\
: "=r" (flag) : "0" (flag) )
/****************************************** 0 */
template <class RetVal, typename T>
RetVal average_0(const std::vector<T> & data)
{
bool overflow = false;
unsigned int m = 0;
for (unsigned i = 0;i < data.size();i++)
{
m += data[i];
CHECK_OVERFLOW(overflow);
}
if (overflow)
// throw (Exception(__FILE__,__LINE__,__PRETTY_FUNCTION__, "integer overflow"));
std::cout << Exception(__FILE__,__LINE__,__PRETTY_FUNCTION__, "integer overflow") << std::endl;
return (RetVal)m / data.size();
}
Кто знает/помнит ассемблер лучше меня, посоветуйте как улучшить макрос. Из недостатков, в частности, его нельзя использовать более одного раза - говорит что метка переопределяется.