小编Quu*_*one的帖子

OS X:将.dylib转换为.a/.o(动态到静态)?

假设我已经阅读过这个警告,我仍然希望将TBB用作静态链接库.(假装我在一个不允许用户创建自己的dylib 的环境中工作.)但我真的不想重写TBB makefile来生成libtbb.a而不是libtbb.dylib.

是否有一个简单的命令行方式将libtbb.dylib转换为libtbb.o并使用相同的入口点?

我听到了一个很好的论据,因为从静态到动态不能走另一条路.即:动态库需要是PIC,将非PIC静态库转换为PIC是不可行的.但据我所知,这一论点并不适用于其他方向.

这里有人说在Windows上将.dll转换为.a是不可能的,但我认为他们只是在讨论将.dll或.exe备份到其原始.o文件中的不可能性,并不一定说它不可能创建具有相同内容的可链接.o文件.此外,Windows上的情况比"真正的"PIC稍微有些奇怪,尽管我认为这并不重要.

tbb dylib static-libraries dynamic-library ios

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

用于时区规则的Linux/crossplatform API?(替换lock localtime_r)

我们有一些代码想要localtime经常从多个线程调用.(相关背景:它是一个服务器,你可以要求它的一个东西是作为字符串的本地时间,它希望能够每秒提供100K的请求.)

我们发现在Ubuntu Linux 12.04上,glibc函数localtime_r("reentrant localtime")调用__tz_convert,仍然需要全局锁定!

(此外,它看起来像FreeBSD的,使localtime_r通话tzset每一次调用,因为他们是偏执狂,该方案可能会做一个setenv("TZ")和/或用户下载的新版本/etc/localtime现在之间上次localtime_r被调用.(这是相反的这里描述的情况;似乎glibc调用tzset 每次调用localtime但不是localtime_r,只是为了让人困惑.)

显然,这对于表现来说太糟糕了.出于我们的目的,我们希望在服务器开始运行时基本上"快照"当前时区的规则,然后永远使用该快照.因此,我们将继续遵守夏令时规则(因为何时切换到DST的规则将成为快照的一部分),但我们永远不会回到磁盘,接受互斥,或做任何会导致线程的其他事情阻止.(我们没有尊重tzinfo的下载更新并且不尊重更改/etc/localtime;我们不希望服务器在运行时物理地更改时区.)

但是,我无法在网上找到有关如何处理时区规则的任何信息 - 是否存在用于处理时区规则的用户空间API,或者我们是否会被迫重新实现几百行glibc代码以自行读取时区数据.

我们是否必须重新实现下游的所有内容__tz_convert- 包括tzfile_read,因为它似乎没有暴露给用户?或者是否有一些POSIX接口和/或第三方库可用于处理时区规则?

(我见过http://www.iana.org/time-zones/repository/tz-link.html但我不确定它是否有用.)

c++ linux timezone multithreading

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

从移动的物体移动

请考虑以下代码.

using T = std::string;

void rotate_left(std::vector<T>& v) {
    T temp = std::move(v[0]);
    for (size_t i=0; i+1 < v.size(); ++i) {
        v[i] = std::move(v[i+1]);
    }
    v.back() = std::move(temp);
}

int main()
{
    std::vector<T> v(3);  // a vector of three Ts
    T x = std::move(v[1]);  // move-from the second element
    rotate_left(v);
    // Can we now say that v[0] is in a moved-from state, or did we
    // get undefined behavior when we moved from v[1] a second time?
}
Run Code Online (Sandbox Code Playgroud)

rotate_left …

c++ language-lawyer move-semantics

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

std::is_trivially_equality_comparable_v&lt;T&gt;

相关但比C++11 相等可比较类型的静态断言更神秘?\xe2\x80\x94

\n\n

JF Bastien 的论文N4130“Pad Thy Atomics!” 让我想到如果我们要使用atomic<T>::compare_exchange_weak()whereT是类或结构类型,例如

\n\n
struct Count {\n    int strong_count;\n    int weak_count;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么我们真的想静态断言两件事:

\n\n

首先,这T实际上是无锁原子的:

\n\n
template<class T>\nstatic constexpr bool is_lockfree_atomic_v =\n    std::atomic<T>::is_always_lock_free;\n
Run Code Online (Sandbox Code Playgroud)\n\n

其次,这compare_exchange_weak将实现我们想要的。回想一下(或来自 N4130)compare_exchange_weak是根据memcmp和定义的memcpy。因此,我们需要检查这些函数是否会做正确的事情T

\n\n
template<class T>\nstatic constexpr bool is_cmpxchgable_v =\n    std::is_trivially_copyable_v<T> &&\n    is_trivially_equality_comparable_v<T>;\n
Run Code Online (Sandbox Code Playgroud)\n\n

is_trivially_copyable_v由STL提供。但我们还没有is_trivially_equality_comparable_v\xe2\x80\x94 ,遗憾的是,我的理解是P0515 一致比较不建议提供一个。(P0515 是允许编译器检测等于运算符实际上是“琐碎的”\xe2\x80\x94 的功能,它不是用户提供的,并且在这样那样的条件下显式默认。但是,它没有在核心语言中引入任何新概念,例如“平凡可比”。)

\n\n

我对“基本可比”特征的最佳尝试如下:

\n\n
template<class T, class U>\nstatic constexpr bool …
Run Code Online (Sandbox Code Playgroud)

c++ type-traits language-lawyer c++20

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

在 struct.unpack 格式字符串中间切换字节序

我有一堆二进制数据(视频游戏保存文件的内容,因为它发生),其中一部分数据包含小端大端整数值。天真地,在没有阅读大量文档的情况下,我试图以这种方式打开它......

struct.unpack(
    '3sB<H<H<H<H4s<I<I32s>IbBbBbBbB12s20sBB4s',
    string_data
)
Run Code Online (Sandbox Code Playgroud)

...当然我收到了这个神秘的错误消息:

struct.error: bad char in struct format
Run Code Online (Sandbox Code Playgroud)

问题是struct.unpack格式字符串不希望单个字段被标记为字节序。此处实际正确的格式字符串类似于

struct.unpack(
    '<3sBHHHH4sII32sIbBbBbBbB12s20sBB4s',
    string_data
)
Run Code Online (Sandbox Code Playgroud)

除了这将翻转第三个I字段的字节序(将其解析为小端,当我真的想将其解析为大端时)。

我的问题有简单和/或“Pythonic”的解决方案吗?我已经想到了三种可能的解决方案,但没有一个是特别优雅的。如果没有更好的想法,我可能会选择第 3 条:

  1. 我可以提取一个子字符串并单独解析它:

    (my.f1, my.f2, ...) = struct.unpack('<3sBHHHH4sII32sIbBbBbBbB12s20sBB4s', string_data)
    my.f11 = struct.unpack('>I', string_data[56:60])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 事后我可以翻转字段中的位

    (my.f1, my.f2, ...) = struct.unpack('<3sBHHHH4sII32sIbBbBbBbB12s20sBB4s', string_data)
    my.f11 = swap32(my.f11)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我可以改变我的下游代码以期望这个字段以不同的方式表示——它实际上是一个位掩码,而不是一个算术整数,所以翻转我正在使用的所有位掩码不会太难;但是这些位掩码的 big-endian 版本比 little-endian 版本在助记方面更相关。

python struct endianness

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

Bash脚本在Ctrl + C上杀死背景(大)孩子

我有一个Bash脚本(Bash 3.2,Mac OS X 10.8),它可以并行调用多个Python脚本,以便更好地利用多个内核.每个Python脚本都需要很长时间才能完成.

问题是,如果我在Bash脚本中间按Ctrl + C,Python脚本实际上不会被杀死.如何编写Bash脚本以便杀死它也会杀死所有后台子节点?

这是我原来的"简化测试案例".不幸的是,我似乎已经减少了太多,以至于它不再表现出问题; 我的错.

set -e

cat >work.py <<EOF
import sys, time
for i in range(10):
    time.sleep(1)
    print "Tick from", sys.argv[1]
EOF

function process {
    python ./work.py $1 &
}

process one
process two
wait
Run Code Online (Sandbox Code Playgroud)

这是一个完整的测试用例,仍然大大减少,但希望这个将证明问题.它在我的机器上再现......但是,两天前,我认为我的机器上再现了旧的测试用例,今天它肯定没有.

#!/bin/bash -e
set -x

cat >work.sh <<EOF
for i in 0 1 2 3 4 5 6 7 8 9; do
    sleep 1; echo "still going"
done
EOF
chmod +x work.sh

function kill_all_jobs { jobs -p …
Run Code Online (Sandbox Code Playgroud)

bash shell kill process wait

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

ruamel.yaml 相当于 sort_keys?

我正在尝试使用ruamel.yaml. 我熟悉json模块的界面,在那里漂亮地打印一个 dict 就像

import json
with open('outfile.json', 'w') as f:
    json.dump(mydict, f, indent=4, sort_keys=True)
Run Code Online (Sandbox Code Playgroud)

有了ruamel.yaml,我已经到了

import ruamel.yaml
with open('outfile.yaml', 'w') as f:
    ruamel.yaml.round_trip_dump(mydict, f, indent=2)
Run Code Online (Sandbox Code Playgroud)

但它似乎不支持该sort_keys选项。似乎ruamel.yaml没有任何详尽的文档,并且在 Google 上搜索“ruamel.yaml sort”或“ruamel.yaml字母化”并没有达到我期望的简单程度。

是否有一个或两个班轮用于漂亮地打印带有排序键的 YAML 文件?

(请注意,我需要在整个容器中递归地将键按字母顺序排列;仅按字母顺序排列顶层是不够的。)


请注意,如果我使用round_trip_dump,则键不会排序;如果我使用safe_dump,则输出不是“YAML 风格”(或更重要的是“Kubernetes 风格”)YAML。我不想要[]{}在我的输出中。

$ pip freeze | grep yaml
ruamel.yaml==0.12.5

$ python
>>> import ruamel.yaml
>>> mydict = {'a':1, 'b':[2,3,4], 'c':{'a':1,'b':2}}
>>> print ruamel.yaml.round_trip_dump(mydict)  # …
Run Code Online (Sandbox Code Playgroud)

python ruamel.yaml

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

在'git pull`上自动触发`git prune`?

在我在公司范围内的存储库的本地副本(我在那里制作了许多短命的分支git rebase,而且很多其他人也在推动短暂的分支到origin我正在拉动),我经常有跟git交谈.

(env)$ git pull
remote: Counting objects: 382, done.
remote: Compressing objects: 100% (247/247), done.
remote: Total 382 (delta 182), reused 62 (delta 62), pack-reused 73
Receiving objects: 100% (382/382), 228.63 KiB | 0 bytes/s, done.
Resolving deltas: 100% (232/232), completed with 15 local objects.
From github.com:anon/anony2
   aee962f..055a717  master     -> origin/master
   [...]
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
error: The last gc run reported the …
Run Code Online (Sandbox Code Playgroud)

git

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

实现这个"错误,抛出"回调的最佳方法是什么?

请注意:在我们得到真正的问题之前,这里有很多背景信息.

我有一个相当宽的C++类层次结构(表示类似不同类型的表达式):

class BaseValue { virtual ~BaseValue(); };
class IntValue final : public BaseValue { int get() const; };
class DoubleValue final : public BaseValue { double get() const; };
class StringValue final : public BaseValue { std::string get() const; };
Run Code Online (Sandbox Code Playgroud)

而另一方面,我有办法强制用户的输入到预期的类型:

class UserInput { template<class T> get_as() const; };
Run Code Online (Sandbox Code Playgroud)

因此,编写匹配器的一种方法是"用户的输入是否等于此BaseValue的值?" - 会是这样的:

class BaseValue { virtual bool is_equal(UserInput) const; };
class IntValue : public BaseValue {
    int get() const;
    bool is_equal(UserInput u) const override {
        return u.get_as<int>() == get(); …
Run Code Online (Sandbox Code Playgroud)

c++ exception visitor template-meta-programming c++14

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

任何范围视图适配器类型(来自“std::views”)是否依赖于堆分配?

我知道至少大多数Ranges 视图类型不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组并通过管道将其通过,std::views::take(42)而不会导致任何堆分配。

但我知道有很多模糊的视图适配器,例如,,,views::join每年都会有更多的视图适配器出现,仅仅因为今天大多数视图适配器显然不分配(在常见情况下)并不意味着所有视图适配器永远不会分配。views::istreamviews::chunk_by

通过类比:我知道大多数标准库算法不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组,并且std::ranges::partition不会引起任何堆分配。但有一些算法(std::inplace_mergestd::stable_sortstd::stable_partition;及其std::ranges对应算法)确实执行运行时堆分配。我们已经有一个 SO 问题跟踪哪些算法堆分配。

因此,我要求一个最新的答案(甚至可能在将来维护/更新):在任何主要 STL 供应商的实现上,是否有任何std::views::适配器需要堆分配?如果有,是哪些以及为什么?

c++ stl standard-library c++20 c++26

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