我必须用相对较少的行来编写一些函数,其中包含大量的常量。
(不用担心我写公式的方式,它只是简单地表达了这样一个事实:我在一个小包中有很多常量,这个具体的例子也很小,实际上我对每个函数都有最小的6-7个常量)
T foo( T x )
{
return k1 * k2 * x - k3;
}假设我对将常量声明为静态(在我的特定情况下还会导致命名约定问题) const T k1 = 42;不感兴趣,我想找到另一种选择。
一个可行的替代方案可以是
T foo( T x )
{
return uint32_t{42} * uint32_t{21} * x - uint32_t{33};
}在这一点上,有两个主要问题:
我为什么要这么做?
很简单,这个常量的值是高度可变的,非常小的值或大的值,对于非常小的值,浪费了大量的空间,加上这个常量是数学常量,所以它们永远不会改变,我可以从第一个版本开始优化这个部分。
还有另一个方面,数字常量的默认类型是有符号整数,我想使用任意大小的无符号整数类型。
函数外的静态声明const T k1 = 42;的问题是,不同的常量具有相同的名称,由于函数的不同,常数的值是不同的,但从数学上讲,常数的名称是相同的,因此在这个解决方案中,我将在同一范围内得到相同变量的多个声明。这就是为什么我不能用名字或者这样的声明。
您对以与C++和C兼容的方式编写这篇文章有什么想法吗?
发布于 2014-05-14 17:11:42
在C中,对于整数,可以在数字中添加'U‘、'L’或'LL‘,使它们以几个组合表示为unsigned、long或long long。
a = -1LL; // long long
b = -1U; // unsigned
c = -1ULL; // unsigned long long
d = -1LLU; // unsigned long long
e = -1LU; // unsigned long
f = -1UL; // unsigned long在C语言中,还有一个选择是使用cast。编译器很可能会做正确的事情:)
return (uint32)42 - (int64)10;但是,正如乌阿赫在下面的注释中指出的,最好的选择可能是对整数常量(C99标准7.18.4)使用宏。
a = UINT32_C(-1); // -1 of type uint_least32_t
b = INT64_C(42); // 42 of type int_least64_t发布于 2014-05-14 22:47:13
这有什么问题吗?
inline T foo(T x)
{
int k1 = 42;
int k2 = 21;
int k3 = 33;
return 1ull * x * k1 * k2 - k3;
}您对另一个答案的评论表明,您不确定要对常量使用哪种类型。我不认为仅仅使用常量是可表示的任何类型有什么问题。
对于计算表达式,您需要考虑中间计算的大小和符号性。在本例中,我从1ull开始使用无符号算术mod 2^64。如果您实际上想要算术mod 2^32,那么使用1ul,以此类推。
你能详细解释一下你所说的“浪费空间”是什么意思吗?这听起来好像你认为使用64位ints有一些问题。你在说什么“太空”?
另外,为了澄清,您不想声明k1全局的原因是因为k1在一个函数中的值与在另一个函数中的值不同?(与之相反,它具有相同的值,但您认为由于某种原因,它应该有不同的数据类型)。
https://stackoverflow.com/questions/23660950
复制相似问题