小编Kyl*_*and的帖子

编译器(特别是rustc)是否可以真正简化三角形求和以避免循环?怎么样?

在Blandy和Orendorff 的《Programming Rust》的第322页上是这样的说法:

...铁锈...认识到,有一种简单的方法可以将数字从1 n求和:总和始终等于n * (n+1) / 2

这当然是相当众所周知的等效项,但是编译器如何识别它?我猜这是在LLVM优化过程中进行的,但是LLVM是否以某种方式从第一原理中推导了等效性,或者它只是具有一些可以简化为算术运算的“公共循环计算”?

compiler-construction compiler-optimization rust llvm-codegen

10
推荐指数
1
解决办法
136
查看次数

错误设置网络掩码有什么影响?

错误设置网络掩码有什么影响?我有一个C++应用程序,用于设置设备的网络掩码.如果网络掩码设置不正确,则tftp似乎无法正常工作.为什么会这样?如果没有为设备/ PC正确设置网络掩码,会出现哪些其他问题?

networking network-programming

8
推荐指数
3
解决办法
5445
查看次数

从compile()获取包括SyntaxError在内的回溯信息

基本问题

看来,SyntaxErrorS(和TypeErrorS)由凸起compile()功能被包括在堆栈跟踪返回的sys.exc_info(),但打印为使用格式化输出的一部分traceback.print_exc.

例如,给定以下代码(其中filename包含带有该行的Python代码的文件的名称$ flagrant syntax error):

import sys
from traceback import extract_tb
try:
    with open(filename) as f:
        code = compile(f.read(), filename, "exec")
except:
    print "using sys.exc_info:"
    tb_list = extract_tb(sys.exc_info()[2])
    for f in tb_list:
        print f
    print "using traceback.print_exc:"
    from traceback import print_exc
    print_exc()
Run Code Online (Sandbox Code Playgroud)

我得到以下输出(其中<scriptname>是包含上述代码的脚本的名称):

using sys.exc_info:
('<scriptname>', 6, 'exec_file', 'code = compile(f.read(), filename, "exec")')
using traceback.print_exc:
Traceback (most recent …
Run Code Online (Sandbox Code Playgroud)

python exception-handling traceback

8
推荐指数
1
解决办法
1422
查看次数

Ninja相当于Make的"从这个目录构建下来"功能(使用CMake)?

使用CMake和Make构建项目时,您可以make从构建树的子目录(即从包含顶层的任何目录下面的目录Makefile)执行,并且make(据我所知)将在或以下构建所有目标那个目录.这是因为CMake Makefile为包含目标的每个目录生成一个,因此当您在目标目录中时,make找到Makefile用于构建这些目标的目录.

但是,当CMake生成Ninja文件时,它只会生成一个 build.ninja文件,该文件位于构建树的顶层.因此,ninja从顶级目录以外的目录调用失败(即使该-f选项不起作用,因为ninja找不到该rules.ninja文件).

有没有办法模仿在目录下和目标下构建目标的"类似"行为?据我所知,没有Ninja目标对应于"特定目录下的所有目标".(这可以使用以每个目录命名的虚假目标来模拟,这些目标依赖于该目录下的所有目标,但CMake默认情况下不会生成此类目标.)

cmake ninja

8
推荐指数
2
解决办法
2437
查看次数

QtQuick ChartView QML对象seg-faults在加载期间导致QML引擎段错误

我有一个QML应用程序,通过链接(通过属性Q_INVOKABLE等)到C++代码中.我可以在没有大多数C++框架的情况下启动QML应用程序qmlscene,并且没有明显的问题(除了应该从C++端提供的缺失数据和功能).

但是,当我构建和部署代码时,我在QQmlApplicationEngine::load()调用期间在Qt框架内得到了一个段错误.

我创建了一个简化的"虚拟"应用程序,似乎触发了完全相同的问题.

C++应用程序:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include "SigCatcher.hpp"  // Proprietary code

int main(
    int argc,
    char *argv[])
{
  SigCatcher sig_catcher;  // Just catches signals & prints stacktrace

  QGuiApplication app(argc, argv);

  QQmlApplicationEngine engine;

  engine.load(
      QUrl(QStringLiteral("qrc:/main.qml")));

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,没有SigCather,我仍然得到段错误,我只是没有得到堆栈跟踪.因此,如果您注释掉SigCatcher导入和声明,则此示例是可重现的.

main.qml:

import QtQuick 2.5
import QtQuick.Controls 1.3
import QtCharts 2.0

ApplicationWindow {
    id:  winRoot
    visible: true

    width:  1024 - 24
    height:  768 - 80

    minimumWidth: width
    minimumHeight: height
    maximumHeight: …
Run Code Online (Sandbox Code Playgroud)

c++ qt segmentation-fault qml

8
推荐指数
1
解决办法
3180
查看次数

is_constructible和is_destructible不受朋友声明的影响

friend在评估std::is_constructible和评估时,Clang和GCC似乎不尊重声明std::is_destructible.

关于`is_constructible,cppreference.com说:

从与T无关的上下文和Args中的任何类型执行访问检查.仅考虑变量定义的直接上下文的有效性.

(该网站没有解释如何is_destructible处理访问检查,但访问修饰符确实会影响is_destructible一般的行为,所以我希望它的工作方式与之相同is_constructible.)

因此,在我看来,这个代码应该编译,因为在直接背景检查构造函数和析构函数都是可用的,由当地变量实例为证:

class Private
{
    Private() {}
    ~Private() {}

    friend class Friend;
};

class Friend
{
    public:
        Friend()
        {
            // Both of these should fire, but they do not.
            static_assert(
                !std::is_constructible<Private>::value,
                "the constructor is public");
            static_assert(
                !std::is_destructible<Private>::value,
                "the destructor is public");
            // There is no error here.
            Private p;
        }
};
Run Code Online (Sandbox Code Playgroud)

...但Coliru编译它没有错误(使用GCC或Clang).

这是两个编译器中的错误(或至少是不合格),或者cppreference.com是否歪曲了标准,还是我误解了cppreference.com的声明?

c++ gcc access-modifiers clang c++11

8
推荐指数
1
解决办法
148
查看次数

在Ruby中减去两个哈希值

是否可以hash修改类以便给定两个哈希值,可以创建仅包含一个哈希中存在但不存在另一个哈希值的新哈希值?

例如:

h1 = {"Cat" => 100, "Dog" => 5, "Bird" => 2, "Snake" => 10}

h2 = {"Cat" => 100, "Dog" => 5, "Bison" => 30}

h1.difference(h2) = {"Bird" => 2, "Snake" => 10}
Run Code Online (Sandbox Code Playgroud)

可选地,该difference方法可以包括任何键/值对,使得键存在于两个哈希中,但是它们之间的值不同.

ruby hash

7
推荐指数
2
解决办法
6952
查看次数

链接器实际上对多重定义的"内联"函数做了什么?

在C和C++中,inline具有外部链接的函数当然可以在链接时具有多个定义,假设这些定义都是(希望)相同的.(我当然是指使用inline链接规范声明的函数,而不是指编译器或链接时优化器实际内联的函数.)

那么,当遇到多个函数定义时,常见的链接器通常会什么?特别是:

  • 所有定义都包含在最终可执行文件或共享库中吗?
  • 函数的所有调用是否都针对相同的定义?
  • 一个或多个C和C++ ISO标准是否需要上述问题的答案,如果没有,大多数常见平台都做同样的事情吗?

PS是的,我知道C和C++是单独的语言,但它们都支持inline,并且它们的编译器输出通常可以通过相同的链接器(例如GCC ld)链接,所以我相信它们之间在这方面没有任何区别.

c c++ linker inline

7
推荐指数
2
解决办法
745
查看次数

虚析构函数改变了decltype的行为

我已经为可选的lazy参数创建了一个标头(在GitHub存储库中也可以看到).(这不是我基于标题的第一个问题.)

我有一个基类模板和两个派生类模板.基类模板有一个protected带有的构造函数static_assert.此构造函数仅由特定的派生类调用.里面的static_assert我使用decltype.

真奇怪的是,内部名称decltype的类型某种程度上受到我的基类模板中是否存在虚拟析构函数的影响.

这是我的MCVE:

#include <type_traits>
#include <utility>

template <typename T>
class Base
{
  protected:
    template <typename U>
    Base(U&& callable)
    {
      static_assert(
          std::is_same<
              typename std::remove_reference<decltype(callable())>::type, T
            >::value,
          "Expression does not evaluate to correct type!");
    }

  public:
    virtual ~Base(void) =default; // Causes error 

    virtual operator T(void) =0;
};

template <typename T, typename U>
class Derived : public Base<T>
{
  public: …
Run Code Online (Sandbox Code Playgroud)

c++ templates decltype virtual-destructor c++14

7
推荐指数
1
解决办法
185
查看次数

从另一个哈希中的相应值中减去哈希值

我希望能够减去两个哈希并在Ruby中获得第三个哈希值.

这两个哈希看起来像这样:

h1 = {"Cat" => 100, "Dog" => 5, "Bird" => 2, "Snake" => 10}
h1.default = 0

h2 = {"cat" => 50, "dog" => 3, "BIRD" => 4, "Mouse" => 75, "Snake" => 10}
h2.default = 0
Run Code Online (Sandbox Code Playgroud)

我想能够像这样在h1上调用一个方法:

h1.difference(h2)
Run Code Online (Sandbox Code Playgroud)

并获得此哈希作为结果:

{"Cat" => 50, "Dog" => 2, "BIRD" => -2, "Mouse" => -75}
Run Code Online (Sandbox Code Playgroud)

我想创建一个新哈希,其中包含来自两个哈希的键和新哈希的值,它们是第一个哈希中键的值减去第二个哈希中该键的值.问题是,无论密钥的情况如何,我都希望这种Hash方法能够正常工作.换句话说,我希望"猫"与"猫"相匹配.

这是我到目前为止所拥有的:

class Hash
  def difference(another_hash)
    (keys + another_hash.keys).map { |key| key.strip }.uniq.inject(Hash.new(0)) { |acc, key| acc[key] = (self[key] - another_hash[key]); acc }.delete_if { |key, value| …
Run Code Online (Sandbox Code Playgroud)

ruby hash

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