小编lz9*_*z96的帖子

为什么gcc不能虚拟化这个函数调用?

#include <cstdio>
#include <cstdlib>
struct Interface {
    virtual void f() = 0;
};

struct Impl1: Interface {
    void f() override {
        std::puts("foo");
    }
};

// or __attribute__ ((visibility ("hidden")))/anonymous namespace
static Interface* const ptr = new Impl1 ;

int main() {
    ptr->f();
}
Run Code Online (Sandbox Code Playgroud)

使用g ++ - 7编译时-O3 -flto -fdevirtualize-at-ltrans -fipa-pta -fuse-linker-plugin,上述ptr->f()调用不能被虚拟化.

似乎没有外部库可以修改ptr.这是GCC优化器的缺陷,还是因为其他一些来源使得虚拟化在这种情况下不可用?

Godbolt链接

更新:似乎clang-7 with -flto -O3 -fwhole-program-vtables -fvisibility=hidden是唯一可以虚拟化此程序的编译器+标志(如2018/03).

c++ gcc compiler-optimization

30
推荐指数
2
解决办法
1664
查看次数

运算符<<(ostream&,obj)在两个不同的流线程上是否安全?

#include <iostream>
#include <sstream>
#include <thread>

using namespace std;

int main()
{
    auto runner = []() {
        ostringstream oss;
        for (int i=0; i<100000; ++i)
            oss << i;
    };

    thread t1(runner), t2(runner);
    t1.join(); t2.join();
}
Run Code Online (Sandbox Code Playgroud)

在g ++ 6.2.1中编译上面的代码,然后运行它valgrind --tool=helgrind ./a.out.赫尔格林德会抱怨:

==5541== ----------------------------------------------------------------
==5541== 
==5541== Possible data race during read of size 1 at 0x51C30B9 by thread #3
==5541== Locks held: none
==5541==    at 0x4F500CB: widen (locale_facets.h:875)
==5541==    by 0x4F500CB: widen (basic_ios.h:450)
==5541==    by 0x4F500CB: fill (basic_ios.h:374)
==5541==    by 0x4F500CB: …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading ostream language-lawyer

15
推荐指数
1
解决办法
477
查看次数

Protobuf3:如何描述重复字符串的映射?

有关地图类型官方文档说:

map<key_type, value_type> map_field = N;

...其中key_type可以是任何整数或字符串类型(因此,除了浮点类型和字节之外的任何标量类型).value_type可以是任何类型.

我想定义一个map<string, repeated string>字段,但它对我来说似乎是非法的libprotoc 3.0.0,它抱怨Expected ">".所以我想知道是否有任何方法可以将重复的字符串放入地图中.

可能的解决方法可能是:

message ListOfString {
    repeated string value = 1;
}

// Then define:
map<string, ListOfString> mapToRepeatedString = 1;
Run Code Online (Sandbox Code Playgroud)

但这ListOfString看起来多余.

protocol-buffers protocol-buffers-3

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

VSCode:如何记录使用复杂对象解析的promise?

我有一个函数f返回一个Promise.返回的Promise任一resolve({name: String, data: Object})reject(Error).

我在VSCode中尝试了以下语法(如JSDoc中的一个问题所述),但它不起作用:

/**
 * @promise fPromise
 * @reject {Error}
 * @fulfill {Object} project
 * @fulfill {Object} project.data
 * @fulfill {String} project.name
 * @returns fPromise
*/
Run Code Online (Sandbox Code Playgroud)

documentation jsdoc visual-studio-code

11
推荐指数
1
解决办法
916
查看次数

如何在 Linux 上列出静态库的所有外部未定义符号?

我有一个静态库libfoo.a,它只是多个.o文件的压缩。我正在寻找一种列出所有符号的方法

  • 在静态库中显示为 UND
  • 在这个静态库中没有定义

这样我就可以找出这个库的所有外部符号依赖项。

binaryfiles elf static-libraries object-files

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

哪些seqlock实现正确?

我正在研究Seqlock的实现。但是我发现的所有资料来源都以不同的方式实现它们。

Linux内核

Linux内核是这样实现的

static inline unsigned __read_seqcount_begin(const seqcount_t *s)
{
    unsigned ret;

repeat:
    ret = READ_ONCE(s->sequence);
    if (unlikely(ret & 1)) {
        cpu_relax();
        goto repeat;
    }
    return ret;
}

static inline unsigned raw_read_seqcount_begin(const seqcount_t *s)
{
    unsigned ret = __read_seqcount_begin(s);
    smp_rmb();
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

基本上,它使用易失性读取以及在读取器端具有获取语义的读取屏障。

使用时,后续读取不受保护:

struct Data {
    u64 a, b;
};

// ...
read_seqcount_begin(&seq);
int v1 = d.a, v2 = d.b;
// ...
Run Code Online (Sandbox Code Playgroud)

rigtorp / Seqlock

RIGTORP_SEQLOCK_NOINLINE T load() const noexcept {
  T copy;
  std::size_t seq0, …
Run Code Online (Sandbox Code Playgroud)

c atomic memory-barriers rust

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

如何重用导入包中的测试代码?

这是我的目录层次结构:

/
|-- main.go // package main, an HTTP server which accepts request and calls C/U APIs in pkg1 to finish certain task
|-- main_test.go // wants to call veryfyTaskNumber in pkg1_test
|-- pkg1 // package pkg1, CRUD APIs with Retrieve&Delete unexported for safety
    |-- pkg1_test.go // contains a function verifyTaskNumber(*testing.T, taskName string, expectedNo int) which calls internal Retrieve function in pkg1
Run Code Online (Sandbox Code Playgroud)

我仅在中有一些用于测试的实用程序功能pkg1_test.gomain.go进口pkg1。现在,我想在我的中使用这些功能main_test.go。搜索之后,我找到了两种可能的解决方案,但是它们都有一些缺点:

  • 将这些功能移到中pkg1.go。但是,这些函数可能包含在生成的二进制文件中go build
  • 将这些功能移到单独的testutility程序包中,然后 …

architecture integration-testing unit-testing go

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

GithubPages:如何为任何文件强制执行自定义内容类型类型?

我们目前使用 Github 页面作为简单的 API 模拟服务器。我们将所有模拟文件放在 和 下docs/,只是GET username.github.io/project/api/someAPI为了检索数据。但是,默认情况下,Github Pages 返回的 Content-Type 不是application/octet-stream没有application/json扩展名的文件,因此我们的前端代码在解析结果时会抛出错误。

我想知道有什么方法可以更改 Github Page 上没有扩展名的文件返回的 Content-Type 吗?

content-type github-pages

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

C++依赖名称:是否需要此类型名称?

a.hpp我定义:

#include <utility>
namespace Board {
    template<int W, int H>
    struct GroupNode
    {
        using PointType = std::pair<int, int>;
        // ...
    };
}
Run Code Online (Sandbox Code Playgroud)

然后,在b.cpp我定义:

#include "a.hpp"
namespace Board {
    template<int W, int H>
    struct NodeList
    {
        using StdList = std::list < /* typename */ GroupNode<W, H>>;
    }
}
// and then use NodeList<19, 19> nl;
Run Code Online (Sandbox Code Playgroud)

上面的代码可以在gcc-6和clang-3.9上编译而不会发出任何警告.然而,克利翁2016.3抱怨cannot resolve variable GroupNodeb.cpp.取消注释typename可以驯服Clion警告,但我想知道这是否typename是必需的?如果是这样,为什么g ++/clang ++没有发出任何警告?

c++ templates dependent-name language-lawyer

5
推荐指数
1
解决办法
196
查看次数

_mm256_undefined_si256 可能有哪些用途?

Intel 提供了一个名为_mm256_undefined_si256 的内在函数,它返回带有未定义元素的 __m256i 类型的向量。

Clang 的实现中,这总是返回 UndefValue,并且通常会导致所有依赖于其值的代码路径被优化掉。

我的问题是:这个内在函数有哪些可能的用途?

c simd intrinsics avx avx2

5
推荐指数
0
解决办法
170
查看次数