小编Ale*_*x B的帖子

与位置无关的代码的差异:x86 vs x86-64

我最近正在构建一个针对x86-64架构的特定共享库(ELF),如下所示:

g++ -o binary.so -shared --no-undefined ... -lfoo -lbar
Run Code Online (Sandbox Code Playgroud)

这失败,出现以下错误:

在制作共享对象时,不能使用对"本地符号"的重定位R_X86_64_32; 用-fPIC重新编译

当然,这意味着我需要将其重建为与位置无关的代码,因此它适合链接到共享库.

But this works perfectly well on x86 with exactly the same build arguments. So the question is, how is relocation on x86 different from x86-64 and why don't I need to compile with -fPIC on the former?

c linux x86 x86-64 elf

24
推荐指数
2
解决办法
5719
查看次数

STL容器元素销毁顺序

ISO C++标准是否要求STL容器内任何类型的对象销毁顺序?

  • std::list/ std::vector/ std::map元素摧毁从开始或容器的末尾开始?
  • 我可以依赖于std::mapstd::pair内部将其元素存储在s中,因此一对中的键在其值之前被销毁(反之亦然)?

c++ portability stl

22
推荐指数
2
解决办法
1657
查看次数

如何使"int"解析空字符串?

我有一个基于布局表的固定长度文本记录的解析系统:

parse_table = [\
    ('name', type, length),
    ....
    ('numeric_field', int, 10), # int example
    ('textc_field', str, 100), # string example
    ...
]
Run Code Online (Sandbox Code Playgroud)

我的想法是,给定一个消息类型的表,我只需要查看字符串,然后根据表中的条目重新构建一个字典.

现在,我可以处理字符串和正确的整数,但int()不会解析所有空格字段(当然有充分的理由).

我想通过定义int处理空字符串的子类来处理它.这样我就可以改变适当的表条目的类型而不在解析代码中引入额外的kludges(比如过滤器),并且它"只是工作".

但我无法弄清楚如何在子类型中覆盖内置类型的构造函数,因为子类中的定义构造函数似乎没有帮助.我觉得我在这里遗漏了一些关于Python内置类型如何工作的基本内容.

我该怎么做呢?我也愿意接受那些不会增加太多复杂性的替代方案.

python

22
推荐指数
3
解决办法
2万
查看次数

联盟元素对齐

如果我有一个联合,C标准保证联合本身将与最大元素的大小对齐.

union U {
    long l;
    int i;
    short s;
    char c[2];
} u;
Run Code Online (Sandbox Code Playgroud)

但它对联盟内各个联盟元素的对齐有什么看法呢?以下表达式是否保证是真的?

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0])
Run Code Online (Sandbox Code Playgroud)

c alignment unions

20
推荐指数
1
解决办法
9334
查看次数

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

将shared_ptr隐藏在typedef后面是不错的风格?

我想减少代码中的一些视觉噪音,并隐藏shared_ptr在这样的typedef后面:

typedef boost::shared_ptr<SomeLongClass> SomeLongClassPtr;
Run Code Online (Sandbox Code Playgroud)

所以这:

void foo(const boost::shared_ptr<SomeLongClass>& a,
         boost::shared_ptr<SomeLongClass>& b);
Run Code Online (Sandbox Code Playgroud)

成为这个:

void foo(const SomeLongClassPtr& a, SomeLongClassPtr& b);
Run Code Online (Sandbox Code Playgroud)

另一方面,我担心我会减少代码的显式性.

哪个是更好的风格?

c++

20
推荐指数
2
解决办法
3014
查看次数

带有HTML5视频请求的自定义标头

我有一个视频资源位于OAuth 2.0墙后面,想要通过<video>标签显示它.如何Authorization通过视频请求发送标头?

html video html5 oauth

20
推荐指数
2
解决办法
4762
查看次数

调整迭代器的行为就像Python中的类文件对象一样

我有一个生成字符串列表的生成器.Python中是否有一个实用程序/适配器可以使它看起来像一个文件?

例如,

>>> def str_fn():
...     for c in 'a', 'b', 'c':
...         yield c * 3
... 
>>> for s in str_fn():
...     print s
... 
aaa
bbb
ccc
>>> stream = some_magic_adaptor(str_fn())
>>> while True:
...    data = stream.read(4)
...    if not data:
...        break
...    print data
aaab
bbcc
c
Run Code Online (Sandbox Code Playgroud)

因为数据可能很大并且需要可流传输(每个片段都是几千字节,整个流是几十兆字节),我不想在将整个生成器传递给流适配器之前急切地评估整个生成器.

python

20
推荐指数
4
解决办法
6638
查看次数

如何可靠地测量Linux中的可用内存?

Linux /proc/meminfo显示了许多内存使用情况统计信息.

MemTotal:      4040732 kB
MemFree:         23160 kB
Buffers:        163340 kB
Cached:        3707080 kB
SwapCached:          0 kB
Active:        1129324 kB
Inactive:      2762912 kB
Run Code Online (Sandbox Code Playgroud)

他们之间有很多重叠.例如,据我所知,可以有活动页面缓存(属于"缓存"和"活动")和非活动页面缓存("非活动"+"缓存").

我想要做的是测量"免费"内存,但其中包括可能被丢弃的已使用页面,而不会对整个系统的性能产生重大影响.

起初,我倾向于使用"免费"+"非活动",但Linux的"免费"实用程序在其"缓冲区调整"显示中使用"自由"+"缓存",所以我很好奇什么是更好的方法.

当内核内存不足时,丢弃页面的优先级是什么?测量可用内存的更合适的度量标准是什么?

linux virtual-memory

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

C++中的C99严格别名规则(GCC)

据我所知,GCC支持C++中的所有C99功能.但是如何在C++代码中处理C99严格别名?

我知道在不相关的类型之间使用C转换进行转换不是严格别名安全的,并且可能生成错误的代码,但是C++呢?由于严格别名不是C++标准的一部分(这是正确的吗?),GCC必须指定语义本身.

我想,const_caststatic_cast相关类型之间的演员阵容,因此他们是安全的,而reinterpret_cast可以打破严格走样规则.

这是正确的理解吗?

c c++ gcc strict-aliasing

18
推荐指数
1
解决办法
7575
查看次数