标签: compiler-optimization

编译器是否优化大小为0的结构?

如果我有一个定义的结构,如下所示:

struct blank {
    int : 0;
};
Run Code Online (Sandbox Code Playgroud)

编译器会在运行时将其优化为零吗?

我问,因为这个相当受欢迎的SO问题.我想在我自己的C/C++代码中使用类似的编译时检查.我正在尝试使程序尽可能最佳,所以如果我只是将它们用于编译时检查,我不希望这些空结构在运行时闲置.

另一方面,是否有一种C++ - 惯用的方式来实现与链接相同的结果?

c++ struct compile-time compiler-optimization

0
推荐指数
1
解决办法
173
查看次数

编译器在优化字符串连接方面有多聪明.

我很好奇C#编译器如何处理下面的两个语句:

String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 );
text = text + "...";
Run Code Online (Sandbox Code Playgroud)

与

String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 ) + "...";
Run Code Online (Sandbox Code Playgroud)

结果当然是一样的,但是连接运算符在第二次设置中是否更好地优化了代码?

在两种情况下,您最终都会为堆栈上的字符串分配4个分配,或者第二种情况只分配3个分配?

在阅读一些代码时,我只是一个随机的问题.

.net c# clr string-concatenation compiler-optimization

0
推荐指数
1
解决办法
463
查看次数

如何使函数primitve param const的良好示例将导致编译器优化

我想更好地了解如何更改函数签名:

void foo(double x);
Run Code Online (Sandbox Code Playgroud)

至:

void foo(const double x);
Run Code Online (Sandbox Code Playgroud)

如果我们不修改x里面,可能会导致代表编译器的一些优化技巧.有人可以给我一个具体的具体例子吗?

c++ const compiler-optimization

0
推荐指数
1
解决办法
84
查看次数

C#编译器是否优化了空的try/catch?

在c#中,空的try catch块花费了多少时间?

我听说它介于10-55ms之间,但我倾向于零/一,因为编译器将用无操作占位符替换空try catch.

任何可以验证这些信息的编译专家?

c# compiler-optimization

0
推荐指数
1
解决办法
257
查看次数

任何编译器都没有将大型交换机块转换为二叉树?

我已经读过现代C++编译器将大块switch转换成二进制树以便在运行时更快地查找,这适用于所有现代C++编译器吗?我主要使用英特尔C++编译器和G ++.

c++ compiler-construction compiler-optimization

0
推荐指数
1
解决办法
112
查看次数

为什么表达式本身在方法参数中的存在使得C#中的方法变慢

请考虑方法:

    private void FastMethod(string param)
    {
    }

    private void SlowMethod<T>(Expression<Func<T>> expression)
    {
    }
Run Code Online (Sandbox Code Playgroud)

并进行以下测试:

    [TestMethod]
    public void Test()
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();
        for (int i = 0; i < 1000000; i++)
        {
            this.FastMethod("TestContext");
        }

        TestContext.WriteLine("Fast time: " + stopwatch.ElapsedMilliseconds);
        stopwatch.Restart();

        for (int i = 0; i < 1000000; i++)
        {
            this.SlowMethod(() => this.TestContext);
        }

        TestContext.WriteLine("Slow time: " + stopwatch.ElapsedMilliseconds);
    }
Run Code Online (Sandbox Code Playgroud)

输出是:

快速时间:4

慢时间:2249

http://i.imgur.com/eYcBfZX.png

我知道这是每100万个电话,所以这看起来可能不是一个严重的性能问题.

但是我希望有一些基于属性设置器中的表达式的逻辑,它们将会经常调用+我只是好奇.

这里有优化空间吗?(我无法摆脱Expression方法参数,基本上我需要做一些语法树解析.有趣的是解析本身足够快).

c# performance lambda expression compiler-optimization

0
推荐指数
1
解决办法
54
查看次数

仅在打开编译器优化的情况下,某些位置的缓冲区溢出

所以我遇到了一个问题,即某段代码给了我这个错误*** BUFFER OVERFLOW DETECTED ***.一旦我打开某些编译器优化选项(这不是我的程序,所以我必须使用这些),这才开始发生.我把它缩小到了它的选择范围.我还找到了一种方法来阻止缓冲区溢出,但是,我在程序的另一部分中有非常相似的代码,当我保留它时不会给我相同的错误.这使我对我的修复非常困惑和非常不自信,所以一些指导将不胜感激.

以下是来自的优化选项 makefile

CXXFLAGS+=-Os -O2 -fomit-frame-pointer 
CXXFLAGS+=-fno-aggressive-loop-optimizations
Run Code Online (Sandbox Code Playgroud)

我把它缩小到-O2开始导致错误的标志.

这是realpath()仅在-O2指定了标志时才在缓冲区溢出时失败的函数

static std::string getRealTargetPath (std::string baseTarget)
    {
    char nextTargetLink[MAXPATHLEN];
    memset (nextTargetLink, 0, MAXPATHLEN);

    if (realpath (baseTarget.c_str(), nextTargetLink) == NULL)
        return "";
    else
       //etc...
    }
Run Code Online (Sandbox Code Playgroud)

如果我将MAXPATHLEN(大小1024)更改为PATH_MAX(大小4096),则上述函数将按预期运行.好,可以.但是,以下代码片段在使用与 std::string baseTarget之前相同的代码后执行~20行.

char realLinkPath[MAXPATHLEN];
memset (realLinkPath, 0, MAXPATHLEN);

do
    {         
    if (realpath (linkPath.c_str(), realLinkPath) != NULL)
        if (strcmp(linkPath.c_str(), realLinkPath) != 0)
            return true; …
Run Code Online (Sandbox Code Playgroud)

c c++ linux makefile compiler-optimization

0
推荐指数
1
解决办法
352
查看次数

经常执行的表达式是否会缓存其结果?

for (int i = 0; i < foo + bar; ++i)
{
      // do something
}
Run Code Online (Sandbox Code Playgroud)

假设这foo + bar是一个巨大的数字,并且它的值在循环迭代期间不会改变.(也就是说,循环的身体不会改变foo或bar)

foo + barget 的值是否缓存在某个地方?或者每次都会重新评估?

C/C++会不会处理它与Java等高级语言的不同?

c++ java caching compiler-optimization cpu-cache

0
推荐指数
2
解决办法
91
查看次数

重新排序操作和无锁数据结构

假设我们Container维护了一组int值,并为每个值指示了该值是否有效.无效值被认为是INT_MAX.最初,所有值都无效.第一次访问值时,将其设置为INT_MAX并将其标志设置为有效.

struct Container {
  int& operator[](int i) {
    if (!isValid[i]) {
      values[i] = INT_MAX; // (*)
      isValid[i] = true;   // (**)
    }
    return values[i];
  }
  std::vector<int> values;
  std::vector<bool> isValid;
};
Run Code Online (Sandbox Code Playgroud)

现在,另一个线程同时读取容器值:

// This member is allowed to overestimate value i, but it must not underestimate it.
int Container::get(int i) {
  return isValid[i] ? values[i] : INT_MAX;
}
Run Code Online (Sandbox Code Playgroud)

这是完全合法的代码,但是它行是至关重要的(*),并(**)在给定的顺序执行.

  1. 在这种情况下,标准是否保证线路按给定顺序执行?至少从单线程的角度来看,线路可以互换,不是吗?
  2. 如果没有,确保订单的最有效方法是什么?这是高性能的代码,所以我不能没有-O3,也不想使用volatile.

c++ gcc lock-free compiler-optimization c++14

0
推荐指数
1
解决办法
94
查看次数

C++编译器通常会"优化"malloc并免费使用new和delete吗?

如果我正在编写100%ANSI C但编译.cpp文件,编译器会自动"优化"malloc和免费调用new和delete吗?鉴于他们的差异,这甚至是否有意义?我不认为这是如何运作的,但我的一位朋友说这就是发生的事情.

c c++ malloc free compiler-optimization

0
推荐指数
2
解决办法
220
查看次数