Visual c++ 使用SSE2编译一个源代码和使用AVX架构编译另一个源代码安全吗?

Visual c++ 使用SSE2编译一个源代码和使用AVX架构编译另一个源代码安全吗?,visual-c++,sse,intrinsics,avx,Visual C++,Sse,Intrinsics,Avx,我使用的是AVX intrinsics,但由于MSVC生成非vex指令的基于_mm256的intrinsics以外的所有指令,因此我需要使用/arch:AVX编译整个源代码。项目的其余部分是使用/arch:SSE2编译的,因此它可以在较旧的CPU上工作,我正在手动检查AVX是否可用 包含为AVX编译的AVX代码的源代码包括一个巨大的模板库和其他东西,只是为了得到定义。编译器/链接器是否有可能决定用AVX指令实例化某个模板,仅仅因为它也包含在此源代码中?在这种情况下,它会在非AVX处理器上崩溃 编

我使用的是AVX intrinsics,但由于MSVC生成非vex指令的基于_mm256的intrinsics以外的所有指令,因此我需要使用/arch:AVX编译整个源代码。项目的其余部分是使用/arch:SSE2编译的,因此它可以在较旧的CPU上工作,我正在手动检查AVX是否可用

包含为AVX编译的AVX代码的源代码包括一个巨大的模板库和其他东西,只是为了得到定义。编译器/链接器是否有可能决定用AVX指令实例化某个模板,仅仅因为它也包含在此源代码中?在这种情况下,它会在非AVX处理器上崩溃

编译器/链接器是否有可能决定实例化 一些带有AVX指令的模板,仅仅因为它已经包含在内 在这个来源呢

是的,这可能会发生,正如我在书中看到的那样。看看这里给出的其他好答案


我首选的解决方法是修改模板以包含区分性参数,但如果它真的是一个巨大的库,这可能会太麻烦,就像您在自己的回答中提到的使用全局定义一样。

您最好不要在具有不同编译选项的模块之间共享C++-ish内容,以免违反“一个定义”规则。把它当作一个DLL,使用纯C接口来跨越边界,除了不同的模块没有自己的命名空间用于外部链接,所以你使用C++的能力也受到限制。我创建了一个测试项目,希望回答你的问题,但它的行为不像我预期的那样,模板似乎是实例化的,尽管它们不需要。。。我应该在几个小时内回答这个问题,或者可能会提出一个新的有点不同的问题……谢谢大家。问题是,如果可能/容易的话,我会做经典的C语言,但它只是依赖于很多定义和东西,所以这是很有问题的。所有这些混乱仅仅是因为编译器没有任何方法来指定我需要vex指令@马克2377请告诉我你发现了什么。当然。顺便说一句,您是通过命令行编译还是使用Visual Studio?两者都有。也可以通过LLVM在Mac上运行,还可以尝试使用英特尔编译器。