只想知道#pragma intrinsic(_m_prefetchw)是什么意思?
答案 0 :(得分:4)
据我所知,看起来有人打算修改某些特定于MSVC ++的设置。但是,该设置不是intrinsic pragma的有效选项。另一方面,_m_prefetchw是3D Now!内在功能。
与所有编译器内部函数一样,它以某种方式将(可能)底层硬件支持的更快的汇编指令公开给您的C或C ++应用程序
一个。更符合优化者,和 B.与使用内联汇编相比,更符合语言。
在x86_64 / x64 / amd64系统上的MSVC上,不支持内联汇编,因此必须使用此类内在函数来访问底层硬件的whizzbang功能。
最后,应该注意_m_prefetchw是3D现在!内在的,3D现在!仅在AMD硬件上受支持。它可能不是你想要用于新代码的东西(即你应该使用SSE,它适用于Intel和AMD硬件,并且有更多的功能可以启动)。
答案 1 :(得分:1)
“#pragma intrinsic”(注释拼写)的含义与所有“#pragma”指令一样,因编译器而异。通常,它表示在语法上看起来像对外部函数的调用的特定事物应该用一些内联代码替换。在某些情况下,这可能会大大提高性能,特别是如果编译器可以为某些或所有参数确定常量值(在后一种情况下,编译器可能能够计算函数的值并用常量替换它)
通常,将函数作为内在函数处理不会造成任何特定问题。最大的危险是,如果用户在一个模块中定义了与编译器的内部函数之一具有相同名称的函数,并尝试从另一个模块调用该函数,则编译器可能会将函数调用替换为其预期的指令序列。为了防止这种情况,一些编译器默认情况下不启用内部函数(因为这样做会导致上述与某些符合标准的程序不兼容),但提供#pragma指令来启用它们。编译器也可以使用命令行选项来启用内在函数(因为标准允许任何内容),或者可以将某些函数(如__memcpy()定义为内部函数),并在string.h中使用#define指令将memcpy转换为__memcpy(因为#include string.h的程序不允许将memcpy用于任何其他目的。)
答案 2 :(得分:0)
在C
中,它取决于实现是否识别(并定义)它。
如果实现无法识别“内在”预处理标记,则忽略该编译指示 如果实现认识到它,那么任何定义都会发生(如果另一个实现以不同的方式定义它,则在另一个实现上会发生另一种情况)。
因此,请查看您正在讨论的实现的文档(编辑:如果您希望在不同的实现上编译源代码,请不要使用它)。
我在我的系统man gcc
中找不到对“#pragma intrinsic”的任何引用。
答案 3 :(得分:-1)
内部编译指示告诉编译器函数已知行为。编译器可以调用函数,而不是用内联指令替换函数调用,如果它会带来更好的性能。
来源:http://msdn.microsoft.com/en-us/library/tzkfha43(VS.80).aspx