假设我已经阅读过这个警告,我仍然希望将TBB用作静态链接库.(假装我在一个不允许用户创建自己的dylib 的环境中工作.)但我真的不想重写TBB makefile来生成libtbb.a而不是libtbb.dylib.
是否有一个简单的命令行方式将libtbb.dylib转换为libtbb.o并使用相同的入口点?
我听到了一个很好的论据,因为从静态到动态不能走另一条路.即:动态库需要是PIC,将非PIC静态库转换为PIC是不可行的.但据我所知,这一论点并不适用于其他方向.
这里有人说在Windows上将.dll转换为.a是不可能的,但我认为他们只是在讨论将.dll或.exe备份到其原始.o文件中的不可能性,并不一定说它不可能创建具有相同内容的可链接.o文件.此外,Windows上的情况比"真正的"PIC稍微有些奇怪,尽管我认为这并不重要.
我们有一些代码想要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但我不确定它是否有用.)
请考虑以下代码.
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++11 相等可比较类型的静态断言更神秘?\xe2\x80\x94
\n\nJF Bastien 的论文N4130“Pad Thy Atomics!” 让我想到如果我们要使用atomic<T>::compare_exchange_weak()whereT是类或结构类型,例如
struct Count {\n int strong_count;\n int weak_count;\n};\nRun Code Online (Sandbox Code Playgroud)\n\n那么我们真的想静态断言两件事:
\n\n首先,这T实际上是无锁原子的:
template<class T>\nstatic constexpr bool is_lockfree_atomic_v =\n std::atomic<T>::is_always_lock_free;\nRun Code Online (Sandbox Code Playgroud)\n\n其次,这compare_exchange_weak将实现我们想要的。回想一下(或来自 N4130)compare_exchange_weak是根据memcmp和定义的memcpy。因此,我们需要检查这些函数是否会做正确的事情T:
template<class T>\nstatic constexpr bool is_cmpxchgable_v =\n std::is_trivially_copyable_v<T> &&\n is_trivially_equality_comparable_v<T>;\nRun Code Online (Sandbox Code Playgroud)\n\nis_trivially_copyable_v由STL提供。但我们还没有is_trivially_equality_comparable_v\xe2\x80\x94 ,遗憾的是,我的理解是P0515 一致比较不建议提供一个。(P0515 是允许编译器检测等于运算符实际上是“琐碎的”\xe2\x80\x94 的功能,它不是用户提供的,并且在这样那样的条件下显式默认。但是,它没有在核心语言中引入任何新概念,例如“平凡可比”。)
我对“基本可比”特征的最佳尝试如下:
\n\ntemplate<class T, class U>\nstatic constexpr bool …Run Code Online (Sandbox Code Playgroud) 我有一堆二进制数据(视频游戏保存文件的内容,因为它发生),其中一部分数据包含小端和大端整数值。天真地,在没有阅读大量文档的情况下,我试图以这种方式打开它......
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 条:
我可以提取一个子字符串并单独解析它:
(my.f1, my.f2, ...) = struct.unpack('<3sBHHHH4sII32sIbBbBbBbB12s20sBB4s', string_data)
my.f11 = struct.unpack('>I', string_data[56:60])
Run Code Online (Sandbox Code Playgroud)事后我可以翻转字段中的位:
(my.f1, my.f2, ...) = struct.unpack('<3sBHHHH4sII32sIbBbBbBbB12s20sBB4s', string_data)
my.f11 = swap32(my.f11)
Run Code Online (Sandbox Code Playgroud)我可以改变我的下游代码以期望这个字段以不同的方式表示——它实际上是一个位掩码,而不是一个算术整数,所以翻转我正在使用的所有位掩码不会太难;但是这些位掩码的 big-endian 版本比 little-endian 版本在助记方面更相关。
我有一个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) 我正在尝试使用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) 在我在公司范围内的存储库的本地副本(我在那里制作了许多短命的分支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) 请注意:在我们得到真正的问题之前,这里有很多背景信息.
我有一个相当宽的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) 我知道至少大多数Ranges 视图类型不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组并通过管道将其通过,std::views::take(42)而不会导致任何堆分配。
但我知道有很多模糊的视图适配器,例如,,,views::join每年都会有更多的视图适配器出现,仅仅因为今天大多数视图适配器显然不分配(在常见情况下)并不意味着所有视图适配器永远不会分配。views::istreamviews::chunk_by
通过类比:我知道大多数标准库算法不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组,并且std::ranges::partition不会引起任何堆分配。但有一些算法(std::inplace_merge、std::stable_sort、std::stable_partition;及其std::ranges对应算法)确实执行运行时堆分配。我们已经有一个 SO 问题跟踪哪些算法堆分配。
因此,我要求一个最新的答案(甚至可能在将来维护/更新):在任何主要 STL 供应商的实现上,是否有任何std::views::适配器需要堆分配?如果有,是哪些以及为什么?