我直到最近才开始探索C ++ Eigen库,并对某些文档感到有些困惑。如果有人可以澄清这一点,那就太好了。
在常见的陷阱(https://eigen.tuxfamily.org/dox-devel/TopicPitfalls.html)对齐问题部分中,它说:“的确,自C ++ 17以来,C ++对显式数据对齐没有足够好的支持。 ”。
关于如何消除对齐问题的页面(https://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html#getrid),该文档说:“如果您只能将[c ++ 17]定位为最近的编译器(例如,GCC> = 7,clang> = 5,MSVC> = 19.12),那么您很幸运:启用c ++ 17应该就足够了。
那么如果我在gcc> = 7.0的情况下使用c ++ 17,对齐就不是Eigen Matrix的问题吗?我了解这个权利吗?并且不需要宏EIGEN_MAKE_ALIGNED_OPERATOR_NEW吗?如果这是正确的,那么负责对齐问题的c ++ 14 / c ++ 17有什么区别?
第二个问题与值传递部分有关(https://eigen.tuxfamily.org/dox-devel/group__TopicPassingByValue.html)。该文档声称按值传递可能是非法的,并且可能使程序崩溃。这让我很困惑。传递值不只是调用复制构造函数吗?举个例子。
Eigen::Vector3f veca = ComputeVecA();
Eigen::Vector3f vecb = veca; //< If pass-by-value is unsafe, is this operation safe?
Run Code Online (Sandbox Code Playgroud)
从C++迁移到Java.
我有一个第三方代码,我需要实现一个类似于此的接口.
public interface Foo<T>{
public T doSomething();
}
Run Code Online (Sandbox Code Playgroud)
我想实现这个接口,以便我可以调用doSomething()并获得3个不同的类A, B and C,这些类扩展了一个共同的基础Z,如下所示.
public class A extends Z{...};
public class B extends Z{...};
public class C extends Z{...};
Run Code Online (Sandbox Code Playgroud)
我找不到任何避免编写以下3个类的方法.
public class ARet implements Foo<A>{...}
public class BRet implements Foo<B>{...}
public class CRet implements Foo<C>{...}
Run Code Online (Sandbox Code Playgroud)
对于给定的接口Foo,是否不可能编写一个返回T extends Z看起来像的实现public class Ret implements Foo<T extends Z>{...}.这似乎不起作用.有没有办法避免这三个类或没有办法绕过它?
我看到一些奇怪的行为,我在这个结构内联初始化的后期向量中描述.支撑-初始化列表
我希望消除一个未定义行为的可能来源.我有以下两个类A,B它们都转发声明,struct Foo但cpp文件定义了如下的实际结构.
// This is A.h
namespace app {
struct Foo;
class A {
private:
std::vector<Foo> fooList;
};
}
// This is A.cpp
struct app::Foo {
std::string first;
std::string second;
unsigned flag;
};
// This is B.h
namespace app {
struct Foo;
class B {
private:
std::vector<Foo> fooList;
};
}
// This is B.cpp
struct app::Foo {
std::string first;
std::string second;
bool flag;
float value;
};
Run Code Online (Sandbox Code Playgroud)
请注意,结构Foo …