这两种方法在C中的效率更高?怎么样:
pow(x,3)
Run Code Online (Sandbox Code Playgroud)
与
x*x*x // etc?
Run Code Online (Sandbox Code Playgroud) gcc 在没有警告的情况下编译以下代码:
#include <cmath>
struct foo {
static constexpr double a = std::cos(3.);
static constexpr double c = std::exp(3.);
static constexpr double d = std::log(3.);
static constexpr double e1 = std::asin(1.);
static constexpr double h = std::sqrt(.1);
static constexpr double p = std::pow(1.3,-0.75);
};
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
的上面使用的标准库函数都不是constexpr功能,我们允许使用它们,其中一个常量表达式从两个需要草案C++ 11标准和草案C++ 14标准部7.1.5 [dcl.constexpr] :
[...]如果它是由构造函数调用初始化的,那么该调用应该是一个常量表达式(5.19).否则,或者如果在引用声明中使用constexpr说明符,则其初始值设定项中出现的每个完整表达式都应为常量表达式.[...]
即使使用-std=c++14 -pedantic 或-std=c++11 -pedantic没有生成警告(请参见实时).使用-fno-builtin产生错误(参见实时),表明这些标准库函数的内置版本被视为constexpr
虽然 …
请参阅更新以获得更好的问题示例.原始代码有各种各样的问题,使图片混乱:
这个问题为什么我可以在constexpr函数中调用非constexpr函数?提出了以下代码
#include <stdio.h>
constexpr int f()
{
return printf("a side effect!\n");
}
int main()
{
char a[f()];
printf("%zd\n", sizeof a);
}
Run Code Online (Sandbox Code Playgroud)
我回答的是格式不正确但gcc 4.8.2允许它(现场观看).
但是,如果我们使用该-fno-builtin标志gcc生成错误(请参见它):
error: call to non-constexpr function 'int printf(const char*, ...)'
return printf("a side effect!\n");
^
Run Code Online (Sandbox Code Playgroud)
所以它seems是gcc正在考虑的内置版本printf是一个常量表达式.gcc 这里构建的文档但不记录这种情况,其中非constexpr函数的内置可以被认为是常量表达式.
如果确实如此:
1.4 实现合规性第8段说(强调我的):符合条件的实现可能具有扩展(包括其他库函数),前提是它们不会改变任何格式良好的程序的行为.需要实现来诊断使用根据本国际标准格式不正确的扩展的程序.但是,这样做之后,他们就可以编译和执行这样的程序. …
是否有人编写了一个符合C++ STL标准的算法,该算法结合std::transform并std::accumulate支持单通道算法,支持一元,二元和甚至(n-ary!)变体,比如说std::transformed_accumulate?我想要这个,因为我发现这种模式在例如线性代数中是高度可重用的,例如在(l1-)范数计算中.l1范数计算元素绝对值的总和.
我正在做一个简单的家庭作业,我必须在C中开发一个软件,找到100个之间的两个最近的点.
当我完成时,我很想知道需要花多少时间才能运行它并获得更多积分并启用完整的VC++优化.我尝试了10000,花了大约8~9秒.然后我很想知道C#和Java花多少时间做同样的事情.正如预期的那样,C#需要更长的时间,9~10秒; 然而,Java只花了大约400毫秒!为什么会这样?!
这是我在C,C#和Java中的代码:
C:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <Windows.h>
long perfFrequency = 0;
typedef struct
{
double X;
double Y;
} Point;
double distance(Point p1, Point p2)
{
return sqrt(pow(p1.X - p2.X, 2) + pow(p1.Y - p2.Y, 2));
}
double smallerDistance(Point *points, int size, Point *smallerA, Point *smallerB)
{
int i, j;
double smaller = distance(points[0], points[1]);
for (i = 0; i < size; i++)
{
for (j = i + 1; j < size; j++) …Run Code Online (Sandbox Code Playgroud) 如何将以下每个数学表达式转换为C中的等效语句?
1 /(x ^ 2 + y ^ 2)
(b ^ 2 - 4ac)的平方根
c++ ×5
c ×3
c++11 ×2
gcc ×2
accumulate ×1
algorithm ×1
c# ×1
c++14 ×1
java ×1
optimization ×1
performance ×1
stl ×1
transform ×1