相关疑难解决方法(0)

114
推荐指数
5
解决办法
10万
查看次数

它是一个符合标准的编译器扩展,将非constexpr标准库函数视为constexpr吗?

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

虽然 …

c++ gcc language-lawyer c++11 c++14

38
推荐指数
1
解决办法
2952
查看次数

gcc是否将非常量表达式函数的内置函数视为常量表达式

请参阅更新以获得更好的问题示例.原始代码有各种各样的问题,使图片混乱:

这个问题为什么我可以在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)

所以它seemsgcc正在考虑的内置版本printf是一个常量表达式.gcc 这里构建的文档但不记录这种情况,其中非constexpr函数的内置可以被认为是常量表达式.

如果确实如此:

  • 是否允许编译器执行此操作?
  • 如果他们被允许,他们不必记录它是否符合要求?
  • 这可以被视为一个扩展,如果是这样的话,似乎需要一个警告,因为C++草案标准部分1.4 实现合规性8段说(强调我的):

符合条件的实现可能具有扩展(包括其他库函数),前提是它们不会改变任何格式良好的程序的行为.需要实现来诊断使用根据本国际标准格式不正确的扩展的程序.但是,这样做之后,他们就可以编译和执行这样的程序. …

c++ gcc language-lawyer constant-expression c++11

11
推荐指数
2
解决办法
1445
查看次数

变换和累加

是否有人编写了一个符合C++ STL标准的算法,该算法结合std::transformstd::accumulate支持单通道算法,支持一元,二元和甚至(n-ary!)变体,比如说std::transformed_accumulate?我想要这个,因为我发现这种模式在例如线性代数中是高度可重用的,例如在(l1-)范数计算中.l1范数计算元素绝对值的总和.

c++ algorithm stl transform accumulate

6
推荐指数
1
解决办法
3106
查看次数

为什么这段代码在java中比在C++和C#中更快?

我正在做一个简单的家庭作业,我必须在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 c# c++ java performance

3
推荐指数
1
解决办法
497
查看次数

如何将数学表达式转换为C语句?

如何将以下每个数学表达式转换为C中的等效语句?

  1. 1 /(x ^ 2 + y ^ 2)

  2. (b ^ 2 - 4ac)的平方根

c mathematical-expressions

-1
推荐指数
1
解决办法
1万
查看次数