CSDN上看到有人问能否实现一个效率较高的max函数,效率接近于宏,于是自动动手写了一个。
由于max宏在判断不同类型时,能够返回大的那个类型(表示范围大),所以只能使用模板来进行返回类型的推导。
在VC8上打开O2或Ox优化选项,测试结果是与宏效率相等。
全部实现如下:
#include <typeinfo>
#include <cassert>
#include <windows.h>
#include <iostream>
template <class T, class U, bool B>
struct BigType
{
typedef T result;
};
template <class T, class U>
struct BigType<T, U, false>
{
typedef U result;
};
template <class T, class U>
struct Type
{
typedef typename BigType<T, U, (sizeof(T) > sizeof(U))>::result BigType;
};
template <class T>
struct Type<T, double>
{
typedef double BigType;
};
template <class T>
struct Type<double, T>
{
typedef double BigType;
};
template <class T>
struct Type<T, float>
{
typedef float BigType;
};
template <class T>
struct Type<float, T>
{
typedef float BigType;
};
template <>
struct Type<double, float>
{
typedef double BigType;
};
template <>
struct Type<float, double>
{
typedef double BigType;
};
template <class T, class U>
typename Type<T, U>::BigType MaX (const T& t, const U& u)
{
typedef typename Type<T, U>::BigType ResultType;
return ResultType(t > u ? t : u); // 原为return (ResultType)t > u ? t : u;
}
int main ()
{
assert (typeid(MaX(1, 2)) == typeid(int));
assert (MaX(1, 2) == 2);
assert (typeid(MaX(1, 2.5)) == typeid(double));
assert (MaX(1, 2.5) == 2.5);
assert (typeid(MaX(1, (float)2.5)) == typeid(float));
assert (MaX(1, (float)2.5) == 2.5);
assert (typeid(MaX((double)2, (float)2.5)) == typeid(double));
assert (MaX((double)2, (float)2.5) == 2.5);
assert (typeid(MaX((long)2, (float)2.5)) == typeid(float));
assert (MaX((long)2, (float)2.5) == 2.5);
assert (typeid(MaX((long)2, (short)2)) == typeid(long));
assert (MaX((long)2, (short)2) == 2);
assert (typeid(MaX((float)2, (__int64)2)) == typeid(float));
assert (MaX((float)2, (__int64)2) == 2);
assert (std::string("hello") < "world");
assert (typeid(MaX(std::string("hello"), "world")) == typeid(std::string));
assert (MaX(std::string("hello"), "world") == "world");
assert (typeid(MaX(std::string("world"), "hello")) == typeid(std::string));
assert (MaX(std::string("hello"), "world") == "world");
// 测试数,需定义在循环外,防止编译器优化掉无意义的循环
__int64 test = 0;
long start = GetTickCount();
for (int i=0; i<1000000000; ++i)
{
test += MaX(i, (__int64)i);
}
// test必须被使用,否则编译器视为无用数据,会被优化掉
std::cout << test << std::endl;
std::cout << (GetTickCount() - start) << std::endl;
test = 0;
start = GetTickCount();
for (int i=0; i<1000000000; ++i)
{
test += max(i, (__int64)i);
}
std::cout << test << std::endl;
std::cout << (GetTickCount() - start) << std::endl;
return 0;
}
相关推荐
C语言程序设计-编写函数实现两个数据的交换,在主函数中输入任意三个数据,调用函数对这三个数据从大到小排序;.c
本文实例讲述了Python中max函数用法。分享给大家供大家参考。具体如下: 这里max函数是Python内置的函数,不需要导入math模块 # 最简单的 max(1, 2) max('a', 'b') # 也可以对列表和元组使用 max([1,2]) max((1,2))...
量化是图像编码过程中的关键步骤,它将图像的每个像素值映射到一个有限的离散集合中。这个过程可能导致信息损失,但可以通过合适的量化策略来尽可能减少这种损失。通常,量化分为均匀量化和非均匀量化,其中Lloyd ...
max函数求4个数最大值
__extension__ 是 GCC 的一个扩展关键字,用于标记一个语句或表达式为扩展语法。例如,在 min 宏定义中,__extension__ 用于标记 statement list 为扩展语法。 使用 typeof 和({})实现 min,避免了副作用 ---------...
在Excel中,MAX函数和SUBTOTAL函数是两个非常实用的工具,它们可以帮助用户快速地处理大量数据,尤其在分析成绩表、寻找最高分等场景下。在这个“利用Excel MAX函数或SUBTOTAL函数取得各科成绩的最高分”的教程中,...
max函数.xls
// 现在可以使用max函数比较Person对象了 Person p1{25}, p2{30}; Person max_person = std::max(p1, p2); ``` 在这个例子中,我们重载了 `运算符,使得 `Person` 类的对象可以根据年龄进行比较。`std::max` 将会...
本练习旨在帮助新手掌握C++中的函数模板和基本输入输出操作,以实现一个计算用户输入整数序列和的功能。 首先,我们需要理解函数模板的基本概念。函数模板是一个未指定类型参数的函数定义,它在编译时会根据传入的...
在Python编程语言中,设计一个函数来返回列表中最大和第二大的元素是一项常见的任务,尤其在数据处理和算法实现中。这个功能可以帮助我们快速找出一组数值中的主要趋势或者最高两个值,无需对整个列表进行排序。下面...
编写自定义函数max,用来求三个数的最大值(要求:数据的输入、输出在主函数中实现)。
1. 首先,创建一个新的项目。在TIA博途软件中,选择“文件”->“新建”来创建一个新项目。由于这个过程在此已省略,我们将直接进入指令的使用部分。 2. 找到并添加所需指令。在项目中,转到右侧的指令工具栏,选择...
1. max(a):如果 a 是一个矩阵,比如 a=[1,2,3;4,5,6],那么 max(a) 的意思就是找出矩阵每列的最大值,本例中 max(a)=[4,5,6]。 2. max(a,b):如果 a 和 b 都是大于 1 维的矩阵,那么要求 a 和 b 的行列的维数都要...
c++ max函数
通常会包含一个数字到模拟转换器(DAC)来提供控制电压,以及一个自动频率范围切换电路,以实现连续的频率调节。此外,还需要设计控制软件,通过单片机或者微处理器来控制MAX038的参数设置,实现对振荡频率、输出幅度...
定义一个数getMax()函数,返回三个数(从键盘输入的整数)中最大值。 def getMax(): num1=int(input("请在键盘上输入第1个整数:")) num2=int(input("请在键盘上输入第2个整数:")) num3=int(input("请在键盘上...
MAX038 是一款高频函数信号发生器芯片,作为 ICL8038 的升级产品,它的最高振荡频率可达 40 MHz,且由于在芯片内采用了多路选择器,使得三种输出波形可通过编程从同一个引脚输出,输出波形的切换时间可在 0.3μs 内...
`arm_max_f32`函数用于计算一个32位浮点数数组中的最大值。函数原型如下: ```c void arm_max_f32( float32_t * pSrc, // 输入向量指针 uint32_t blockSize, // 输入向量长度 float32_t * pResult, // 返回最大...
根据提供的文件信息,本文将详细解析与“自己写的 MAX7219 程序 数码管键盘高速驱动芯片”相关的知识点。 ### MAX7219 概述 MAX7219是一款由Maxim Integrated生产的多功能串行输入/串行或并行输出的驱动器IC,通常...
MAX038是一个高频函数信号发生器芯片,由MAXIM公司生产。该芯片具有广泛的应用前景,主要特点是结构简单、可调元件少、工作可靠。MAX038芯片可以产生准确的高频方波、正弦波、三角波、锯齿波等信号,峰峰值精确地...