refactor
improve gcc compatability, add noexcept to destructors