I'm curious, because I don't understand why VC refuses to inline this function:
Code:
template<typename T, bool UNDERFLOW_T, bool OVERFLOW_T, bool THROW_T,
bool LOGGING_T, T UPPER_T, T LOWER_T>
CInt<T, UNDERFLOW_T, OVERFLOW_T, THROW_T, LOGGING_T, UPPER_T, LOWER_T>
CInt<T, UNDERFLOW_T, OVERFLOW_T, THROW_T, LOGGING_T, UPPER_T, LOWER_T>::
operator + (const CInt& Data)
{
//if (bOverflow && m_Data + Data.m_Data > boost::integer_traits<T>::const_max)
T tmp = m_Data + Data.m_Data;
if (OVERFLOW_T)
{
//T UpperRange = UPPER_T / 2;
//T NewValue = m_Data / 2 + Data.m_Data / 2;
//T Carry = (m_Data & Data.m_Data & 1);
//T Tmp = NewValue + Carry;
//if (UpperRange < Tmp)
if (tmp < m_Data && Data.m_Data > 0)
{
if (THROW_T)
throw std::overflow_error("");
else
set_overflow();
}
}
//if ( UNDERFLOW_T && m_Data + Data.m_Data < boost::integer_traits<T>::const_min)
if (UNDERFLOW_T)
{
T LowerRange = LOWER_T / 2;
T NewValue = m_Data / 2 + Data.m_Data / 2;
T Carry = (m_Data ^ Data.m_Data) & 1;
T Tmp = NewValue - Carry;
if (LowerRange > Tmp)
throw std::underflow_error("");
}
return tmp;
}
Although, the compiler seems to have inlined this implementation:
Code:
template<typename T, bool UNDERFLOW_T, bool OVERFLOW_T, bool THROW_T,
bool LOGGING_T, T UPPER_T, T LOWER_T>
CInt<T, UNDERFLOW_T, OVERFLOW_T, THROW_T, LOGGING_T, UPPER_T, LOWER_T>
CInt<T, UNDERFLOW_T, OVERFLOW_T, THROW_T, LOGGING_T, UPPER_T, LOWER_T>::
operator + (const CInt& Data)
{
T tmp = m_Data + Data.m_Data;
if (OVERFLOW_T || UNDERFLOW_T)
{
if (tmp < m_Data && OVERFLOW_T && Data.m_Data > 0)
set_overflow();
if (tmp > m_Data && UNDERFLOW_T && Data.m_Data < 0)
set_underflow();
}
return tmp;
}
Does anyone think they can guess as to why?
Removing the overflow/underflow checking, it just performs an addition operation with 4 instructions.
Even with overflow/underflow checking, I don't see why it can't inline.