std::sort & comp - 调用约定?
std::sort & comp - calling convention?
Windows targeted project,
Visual Studio 2012
我正在尝试使用 std::sort 对结构指针数组进行排序。排序是从结构中包含的 GUID 完成的,因此我想为我的排序调用定义一个自定义比较函数。
std::sort(
std::begin(pUnits),
std::end(pUnits),
MyCustomSortFunctionHere
);
现在我的问题是,所提供的比较函数的预期调用约定是什么?问题可能是,调用约定在这里有什么不同吗?
我需要知道的原因是,我的项目设置使用默认调用约定,因此如果我在没有明确声明调用约定的情况下声明我的比较函数,我想知道它是否会中断。似乎无法在任何地方找到有关此的任何信息。
谢谢。
我的推理是 MyCustomSortFunctionHere
函数(或 class 方法?)是按照您要求的调用约定调用的:with
extern "C" bool MyCustomSortFunctionHere(Unit const*, Unit const*);
它将按照 "C" 调用约定进行调用。
由于 std::sort()
是一个模板函数,它实际上是和你的代码一起编译在它的同一个翻译单元中,包括调用你的比较函数的部分,对 MyCustomSortFunctionHere
的调用遵循你指定的规则在该翻译单元中。
如果您在同一个翻译单元中定义比较函数,您应该避免不指定任何约定。
如果该函数是在不同的翻译单元中定义的,则您需要向编译器表达这是正确的调用约定。
您的 MyCustomSortFunctionHere 是如何实现的?
一种。使用仿函数或,
b.使用方法签名 bool cmp(const Type1 &a, const Type2 &b)
如果是第一种方法,则使用 "thiscall" 调用约定,如果是第二种方法,则使用 __cdecl 调用约定。
我使用 Visual Studio 编译器针对上述每种方法生成的代码的反汇编验证了上述内容。
希望对您有所帮助!
Windows targeted project, Visual Studio 2012
我正在尝试使用 std::sort 对结构指针数组进行排序。排序是从结构中包含的 GUID 完成的,因此我想为我的排序调用定义一个自定义比较函数。
std::sort(
std::begin(pUnits),
std::end(pUnits),
MyCustomSortFunctionHere
);
现在我的问题是,所提供的比较函数的预期调用约定是什么?问题可能是,调用约定在这里有什么不同吗?
我需要知道的原因是,我的项目设置使用默认调用约定,因此如果我在没有明确声明调用约定的情况下声明我的比较函数,我想知道它是否会中断。似乎无法在任何地方找到有关此的任何信息。
谢谢。
我的推理是 MyCustomSortFunctionHere
函数(或 class 方法?)是按照您要求的调用约定调用的:with
extern "C" bool MyCustomSortFunctionHere(Unit const*, Unit const*);
它将按照 "C" 调用约定进行调用。
由于 std::sort()
是一个模板函数,它实际上是和你的代码一起编译在它的同一个翻译单元中,包括调用你的比较函数的部分,对 MyCustomSortFunctionHere
的调用遵循你指定的规则在该翻译单元中。
如果您在同一个翻译单元中定义比较函数,您应该避免不指定任何约定。 如果该函数是在不同的翻译单元中定义的,则您需要向编译器表达这是正确的调用约定。
您的 MyCustomSortFunctionHere 是如何实现的?
一种。使用仿函数或,
b.使用方法签名 bool cmp(const Type1 &a, const Type2 &b)
如果是第一种方法,则使用 "thiscall" 调用约定,如果是第二种方法,则使用 __cdecl 调用约定。 我使用 Visual Studio 编译器针对上述每种方法生成的代码的反汇编验证了上述内容。
希望对您有所帮助!