小编And*_*zos的帖子

确定两个文件路径是否指向Linux/C下的同一文件?

在Linux下,我有两个文件路径A和B:

const char* A = ...;
const char* B = ...;
Run Code Online (Sandbox Code Playgroud)

我现在想确定,我应该open(2)两个......

int fda = open(A, ...);
int fdb = open(B, ...);
Run Code Online (Sandbox Code Playgroud)

...我会在文件系统中打开两个文件句柄到同一个文件吗?

为了确定这一点,我想到了stat(2):

struct stat
{
    dev_t st_dev;
    ino_t st_ino;
    ...
}
Run Code Online (Sandbox Code Playgroud)

像(伪代码)的东西:

bool IsSameFile(const char* sA, const char* sB)
{
    stat A = stat(sA);
    stat B = stat(sB);

    return A.st_dev == B.st_dev && A.st_ino == B.st_ino;
}
Run Code Online (Sandbox Code Playgroud)

有没有A和B是同一个文件但IsSameFile会返回false的情况?

是否有任何情况下A和B是不同的文件但IsSameFile会返回true?

有没有更好的方法来做我想做的事情?

c linux filesystems stat

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

积分转换的运行时检查

假设下面的函数:

template<typename T, typename U>
bool IsRepresentable(U u);
Run Code Online (Sandbox Code Playgroud)

TU在非布尔整数类型。

如果整数值u是表示的TIsRepresentable应该返回true,否则就应该返回false

IsRepresentable在C ++ 17中实现的最佳方法是什么?(或者标准库中是否存在现有的类似功能?)

(我现在的想法是一个constexpr的if-else链围绕std::is_signed/ sizeof/ std::numeric_limits- ?但我错过了一些更容易或更简单的方法)

c++ c++17

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

指定初始化和基类?

在C++20(最新草案)中,给出以下代码:

struct B { int mb; };
struct D : B { int md; };
Run Code Online (Sandbox Code Playgroud)

这六个表达式中哪些是格式错误的,哪些不是?

/*1*/ D{42, 43}
/*2*/ D{{42}, 43}
/*3*/ D{42, .md = 43}
/*4*/ D{{42}, .md = 43}
/*5*/ D{.mb = 42, .md = 43}
/*6*/ D{{.mb = 42}, .md = 43}
Run Code Online (Sandbox Code Playgroud)

c++ c++20

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

在 C++20 中使用 typename 需要 / 概念?

请考虑以下 C++20 程序:

#include <iostream>

template<typename T>
struct A {
    using X = typename T::X;
};

template<typename T>
constexpr bool WorksWithA = requires { typename A<T>; };

struct GoodArg {
    using X = int;
};

struct BadArg {
};

int main() {
    std::cout << WorksWithA<GoodArg> << std::endl;
    std::cout << WorksWithA<BadArg> << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这是畸形的吗?如果不是,输出应该是什么?

我期待输出是,1 0但我在 clang 中观察到1 1。谁是对的,为什么?

$ clang++ --version
clang version 10.0.0-4ubuntu1 
$ clang++ test.cc -std=c++20
$ ./a.out 
1
1
Run Code Online (Sandbox Code Playgroud)

c++ c++20

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

常用的 C++ ABI 和修改方案有哪些?

gcc/Linux 使用的 C++ ABI/重整方案称为Itanium C++ ABI。Mangling 是第 5.1 节。

除了这个之外,还有多少其他常用的 C++ ABI 和重整方案?他们叫什么?

(例如,我假设 MSVC 和 Windows 有自己的一个?它叫什么?它在某处有记录吗?)

c++ name-mangling

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

在google-chrome中打开标准流

我有一个程序可以创建一个html文件作为标准输出。要在vim中查看它,我只需要:

$ foo2html foo | vim -
Run Code Online (Sandbox Code Playgroud)

vim将以标准输入读取启动以供查看。关闭vim后,命令将返回。

是否有一些命令行开关组合可以使google-chrome做到这一点?

linux google-chrome

5
推荐指数
2
解决办法
1242
查看次数

C++ 11:使用单范围循环有效地迭代矩阵?

(对于具体的编译器/平台上下文,请在x86_64上使用GCC 4.7和Ubuntu 12.04)

给定一些函数f:

void f(int x, int y);

int nx = ...;
int ny = ...;
Run Code Online (Sandbox Code Playgroud)

迭代从(0,0)到(nx,ny)的每个值(x,y)的一种方法是:

for (int x = 0; x < nx; x++)
    for (int y = 0; y < ny; y++)
        f(x,y);
Run Code Online (Sandbox Code Playgroud)

让这个编译成一些生成的代码Q1.

我们将编写一个函数g,使得:

for (auto it : g(Z))
    f(it.x, it.y);
Run Code Online (Sandbox Code Playgroud)

编译成代码Q2.

有可能写出这样的Q2,Q2和Q1一样有效吗?如果有,怎么样?如果没有,我们能得到的最接近的是什么?

如果有帮助,您可以将auto更改为auto&或auto &&.

您也可以将it.x更改为it.x(),并将it.y更改为it.y(),如果有帮助的话.

(回想一下,基于范围的扩展只是你选择的迭代器类型:C++ 11:基于范围的for语句:"range-init"生命周期?)

c++ gcc c++11

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

在有向树图中找到"最佳根"?

(这来自最近完成的编程竞赛)

给出G,一个具有N个节点和N-1个边的连通图.

(请注意,这意味着G形成一棵树.)

G的每个边缘都是定向的.(不一定向上到任何根)

对于G的每个顶点v,可以反转零个或多个边缘,使得存在从每个其他顶点w到v的有向路径.让实现此目的的最小可能的边缘反转数量为f(v).

通过线性或对数线性算法,我们可以确定具有最小整体f(v)的顶点子集(包括那些顶点的f(v)的值)?

例如,考虑具有这些边的4顶点图:

A<--B
C<--B
D<--B
Run Code Online (Sandbox Code Playgroud)

f(A)的值= 2,f(B)= 3,f(C)= 2,f(D)= 2 ......

因此,所需的输出是{A,C,D}和2

(注意我们只需要计算具有最小f(v)的顶点的f(v) - 而不是所有顶点

码:

对于后代,这里是解决方案的代码:

int main()
{
    struct Edge
    {
        bool fwd;
        int dest;
    };

    int n;
    cin >> n;

    vector<vector<Edge>> V(n+1);

    rep(i, n-1)
    {
        int src, dest;
        scanf("%d %d", &src, &dest);

        V[src].push_back(Edge{true, dest});
        V[dest].push_back(Edge{false, src});
    }

    vector<int> F(n+1, -1);

    vector<bool> done(n+1, false);

    vector<int> todo;
    todo.push_back(1);
    done[1] = true;
    F[1] = 0;

    while (!todo.empty())
    {
        int next = todo.back();
        todo.pop_back();

        for (Edge …
Run Code Online (Sandbox Code Playgroud)

algorithm tree graph-theory graph

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

C++ 11:对const和引用类型的`auto`动作的标准引用

假设我有一个T型:

typedef ... T;
Run Code Online (Sandbox Code Playgroud)

然后我有这些功能:

T f11();
T& f12();
T&& f13();
const T f21();
const T& f22();
const T&& f23();
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它们:

auto x11 = f11();
auto x12 = f12();
auto x13 = f13();
auto x21 = f21();
auto x22 = f22();
auto x23 = f23();
Run Code Online (Sandbox Code Playgroud)

从哪个C++ 11标准的section /子句可以推导出x11..x23的等效非自动声明?

c++ c++11

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

Linux 3.5:从多个线程安全地从同一个fd`open(2)``/ dev/urandom`中读取(2)`

这样做是否安全:

int fd;

void thread_main()
{
    char buf[M];
    ssize_t r = read(fd, buf, M);
    assert(r == M);
    ...
}

int main()
{
    fd = open("/dev/urandom", O_RDONLY);

    for (int i = 0; i < N; i++)
         start_thread(i);

    for (int i = 0; i < N; i++)
         join_thread(i);
}
Run Code Online (Sandbox Code Playgroud)

也就是说:在open(2)荷兰国际集团"/dev/urandom"从主线程,是安全的read(2)它从不同的线程上下文不同步?

断言在什么情况下会引发火灾?两个线程会得到相同的数据吗?怎么可能出错?

c linux multithreading pthreads linux-device-driver

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