Skip to content
Snippets Groups Projects
Commit e8566b4a authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Get back to explicit default constructors and get rid of 'no_init'

The 10% performances lost is fixed doing so, which is quite unexpected

Fixes issue #4
parent 8c40a7bf
No related branches found
No related tags found
1 merge request!11Feature/mpi
......@@ -36,7 +36,7 @@ public:
PASTIS_INLINE
constexpr TinyMatrix operator-() const
{
TinyMatrix opposed{no_init};
TinyMatrix opposed;
for (size_t i=0; i<N*N; ++i) {
opposed.m_values[i] = -m_values[i];
}
......@@ -63,7 +63,7 @@ public:
constexpr TinyMatrix operator*(const TinyMatrix& B) const
{
const TinyMatrix& A = *this;
TinyMatrix AB{no_init};
TinyMatrix AB;
for (size_t i=0; i<N; ++i) {
for (size_t j=0; j<N; ++j) {
T sum = A(i,0)*B(0,j);
......@@ -80,7 +80,7 @@ public:
constexpr TinyVector<N,T> operator*(const TinyVector<N,T>& x) const
{
const TinyMatrix& A = *this;
TinyVector<N,T> Ax{no_init};
TinyVector<N,T> Ax;
for (size_t i=0; i<N; ++i) {
T sum = A(i,0)*x[0];
for (size_t j=1; j<N; ++j) {
......@@ -129,7 +129,7 @@ public:
PASTIS_INLINE
constexpr TinyMatrix operator+(const TinyMatrix& A) const
{
TinyMatrix sum{no_init};
TinyMatrix sum;
for (size_t i=0; i<N*N; ++i) {
sum.m_values[i] = m_values[i]+A.m_values[i];
}
......@@ -148,7 +148,7 @@ public:
PASTIS_INLINE
constexpr TinyMatrix operator-(const TinyMatrix& A) const
{
TinyMatrix difference{no_init};
TinyMatrix difference;
for (size_t i=0; i<N*N; ++i) {
difference.m_values[i] = m_values[i]-A.m_values[i];
}
......@@ -232,8 +232,10 @@ public:
this->_unpackVariadicInput(t, std::forward<Args>(args)...);
}
// One does not use the '=default' constructor to avoid (unexpected)
// performances issues
PASTIS_INLINE
constexpr TinyMatrix() noexcept = default;
constexpr TinyMatrix() noexcept {}
PASTIS_INLINE
constexpr TinyMatrix(const ZeroType&) noexcept
......@@ -255,11 +257,6 @@ public:
}
}
// Default constructor helper. Used to define uninitialized TinyMatrix
// avoiding compiler's false uninitialized warning.
PASTIS_INLINE
constexpr TinyMatrix(const NoInitType&) noexcept {}
PASTIS_INLINE
constexpr TinyMatrix(const TinyMatrix&) noexcept = default;
......@@ -275,7 +272,7 @@ PASTIS_INLINE
constexpr TinyMatrix<N,T> tensorProduct(const TinyVector<N,T>& x,
const TinyVector<N,T>& y)
{
TinyMatrix<N,T> A{no_init};
TinyMatrix<N,T> A;
for (size_t i=0; i<N; ++i) {
for (size_t j=0; j<N; ++j) {
A(i,j) = x[i]*y[j];
......@@ -292,7 +289,7 @@ constexpr T det(const TinyMatrix<N,T>& A)
static_assert(std::is_floating_point<T>::value, "determinent for arbitrary dimension N is defined for floating point types only");
TinyMatrix<N,T> M = A;
TinyVector<N, size_t> index{no_init};
TinyVector<N, size_t> index;
for (size_t i=0; i<N; ++i) index[i]=i;
T determinent = 1;
......@@ -363,7 +360,7 @@ constexpr TinyMatrix<N-1,T> getMinor(const TinyMatrix<N,T>& A,
{
static_assert(N>=2, "minor calculation requires at least 2x2 matrices");
Assert((I<N) and (J<N));
TinyMatrix<N-1,T> M{no_init};
TinyMatrix<N-1,T> M;
for (size_t i=0; i<I; ++i) {
for (size_t j=0; j<J; ++j) {
M(i,j)=A(i,j);
......
......@@ -31,7 +31,7 @@ class TinyVector
PASTIS_INLINE
constexpr TinyVector operator-() const
{
TinyVector opposed{no_init};
TinyVector opposed;
for (size_t i=0; i<N; ++i) {
opposed.m_values[i] =-m_values[i];
}
......@@ -106,7 +106,7 @@ class TinyVector
PASTIS_INLINE
constexpr TinyVector operator+(const TinyVector& v) const
{
TinyVector sum{no_init};
TinyVector sum;
for (size_t i=0; i<N; ++i) {
sum.m_values[i] = m_values[i]+v.m_values[i];
}
......@@ -125,7 +125,7 @@ class TinyVector
PASTIS_INLINE
constexpr TinyVector operator-(const TinyVector& v) const
{
TinyVector difference{no_init};
TinyVector difference;
for (size_t i=0; i<N; ++i) {
difference.m_values[i] = m_values[i]-v.m_values[i];
}
......@@ -197,13 +197,10 @@ class TinyVector
this->_unpackVariadicInput(t, std::forward<Args>(args)...);
}
// Default constructor helper. Used to define uninitialized TinyVector
// avoiding compiler's false uninitialized warning.
// One does not use the '=default' constructor to avoid (unexpected)
// performances issues
PASTIS_INLINE
constexpr TinyVector(const NoInitType&) noexcept {}
PASTIS_INLINE
constexpr TinyVector() noexcept = default;
constexpr TinyVector() noexcept {}
PASTIS_INLINE
constexpr TinyVector(const ZeroType&) noexcept
......
#ifndef TYPES_HPP
#define TYPES_HPP
enum class NoInitType { no_init };
constexpr NoInitType no_init=NoInitType::no_init;
enum class ZeroType { zero };
constexpr ZeroType zero=ZeroType::zero;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment