【发布时间】:2018-06-09 05:42:05
【问题描述】:
我正在使用“高级语言”(Nim)进行编程,出于性能原因,我必须“使用 C”。我想做这样的事情:
/* Pseudocode */
include <VersionHelpers.h>
/* ...*/
if (isWindows8OrGreater()) {
/** use InterlockedIncrementNoFence64() */
} else {
/** use InterlockedIncrement64() ;( */
}
但有人告诉我它会在 Windows 7 上崩溃,因为如果我引用 InterlockedIncrementNoFence64(),它必须可用,即使我不尝试调用它。
我正在编写一个多线程应用程序,通信是通过“消息”实现的(即使在同一个线程中)。这将为每条消息调用,因此内存栅栏会对性能产生重大影响。
我已经习惯了 Java,这样的事情在哪里可以工作,并且不知道这是如何在 C 中完成的。
【问题讨论】:
-
在编译时使用预处理器宏而不是在运行时使用函数进行相关检查。
-
使用Linker Support for Delay-Loaded DLLs。无需构建不同的版本,并报告链接时无法解析导入,供您处理。当 Linux 开发人员建议有关在 Windows 中链接的解决方案时,请始终保持怀疑。它们通常是错误的(如本例所示)。
-
@IInspectable 虽然延迟加载通常很有用,但在这种情况下它不起作用,因为您无法延迟加载 kernel32。但在这种情况下它可能也无关紧要,因为实现是由a compiler intrinsic 提供的。没有要导入的操作系统函数。
-
为您的工具链制作不受支持的补丁通常不被认为是一种好的工程实践。它不可扩展,不可移植,总有一天您会丢失硬盘或重新安装/升级 Visual Studio(或移植到新架构)并丢失补丁。链接器试图将您从自己手中拯救出来:
GetProcAddress在 kernel32 中。那么你怎么能延迟加载GetProcAddress? -
@RbMm 看来您的答案确实只适合您而不适合其他人,因为它与您的专业知识(修补链接器)、您的开发环境(您不为 x86 和 x64 以外的任何东西构建)和您的客户群(他们不在乎他们使用的产品依赖于不受支持的技术)。答案通常没有用,因为大多数人没有相同的技能、目标和客户组合。
标签: c windows operating-system