mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-29 16:40:38 +08:00
Store ProductManifold instances in a tuple
Since the number of manifolds used to initialize ProductManifold and their types are known at compile-time, it is possible to avoid storing pointers to the base class as required by a homogeneous, currently dynamically sized container. Instead, we can use std::tuple<> as a heterogenous container with the number of elements fixed at compile-time that allows us to store the concrete manifold realizations. The advantage of this approach is that we can bypass the vtable when iterating over each manifold within ProductManifold. The indirection is invoked only once while accessing the ProductManifoldImpl members. Additionally, potential dynamic memory allocations by a std::vector can be completely avoided. This makes the ProductManifold implementation more efficient both in memory and runtime. Change-Id: Ic71b0c175ab726f8992e9703f7666bca477baf19
This commit is contained in:
committed by
Alex Stewart
parent
9f32c42ba6
commit
7743d2e73c
@@ -306,7 +306,8 @@ void BuildProblem(BALProblem* bal_problem, Problem* problem) {
|
||||
if (CERES_GET_FLAG(FLAGS_use_quaternions) &&
|
||||
CERES_GET_FLAG(FLAGS_use_manifolds)) {
|
||||
Manifold* camera_manifold =
|
||||
new ProductManifold(new QuaternionManifold, new EuclideanManifold<6>);
|
||||
new ProductManifold<QuaternionManifold, EuclideanManifold<6>>{
|
||||
QuaternionManifold{}, EuclideanManifold<6>{}};
|
||||
for (int i = 0; i < bal_problem->num_cameras(); ++i) {
|
||||
problem->SetManifold(cameras + camera_block_size * i, camera_manifold);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user