我发现有些图书馆链接到librt.so,而其他图书馆则没有。我想知道它是在什么情况下链接的。
我从来没有直接使用过这个库。有没有演示显示它的直接用法?有没有相关的头文件?
我想要一个包含无序,可重复项目的集合.在Java中,Set是不可重复的,List是有序的,这不是我想要的.
似乎Pool是一个合适的集合,但它在Java中不存在.界面应如下:
public interface Pool<T> {
void set(T item);
T get();
}
Run Code Online (Sandbox Code Playgroud)
它存在于某个地方吗?
补充:
我意识到我错误地表达了自己的想法.事实上,我希望有这样的界面:
public interface Pool<T> {
void put(T item);
T randomRemove();
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我希望每次都能得到一个项目.我怎样才能实现它?
我们知道C++使用vftable来动态决定应该调用哪个虚函数。我想找出当我们调用虚函数时其背后的机制。我已将以下代码编译为程序集。
using namespace std;
class Animal {
int age;
public:
virtual void speak() {}
virtual void wash() {}
};
class Cat : public Animal {
public:
virtual void speak() {}
virtual void wash() {}
};
void main()
{
Animal* animal = new Cat;
animal->speak();
animal->wash();
}
Run Code Online (Sandbox Code Playgroud)
汇编代码非常庞大。我不太明白以下部分。
CONST SEGMENT
??_7Cat@@6B@ DD FLAT:??_R4Cat@@6B@ ; Cat::`vftable'
DD FLAT:?speak@Cat@@UAEXXZ
DD FLAT:?wash@Cat@@UAEXXZ
CONST ENDS
Run Code Online (Sandbox Code Playgroud)
这部分定义了Cat的vftable。但它有三个条目。第一个条目是 RTTI 完整对象定位器。第二个是 Cat::speak。第三个是 Cat::wash。所以我认为 vftable[0] 应该暗示 RTTI 完整对象定位器。但是当我检查main PROC和Cat::Cat PROC中的汇编代码时,to的调用animal->speak()是通过调用vftable[0]实现的,to的调用animal->wash()是通过调用vftable[4]实现的。为什么不是 vftable[4] 和 vftable[8]?
PROC main …
我想知道下面的代码是否有错误的语法?
#!/bin/bash
set -e
let "time_used = 1 - 1"
echo $time_used
Run Code Online (Sandbox Code Playgroud)
当我运行它时,没有打印任何内容。剧本死了let "time_used = 1 - 1"。
如果我set -e在第二行删除,我会得到正确的结果0。
为什么会发生?
我非常简单的代码如下所示
#include <iostream>
#include <stdalign.h>
int main() {
char array_char[2] = {'a', 'b'};
float array_float[2] = {1, 2};
std::cout << "alignof(array_char): " << alignof(array_char) << std::endl;
std::cout << "alignof(array_float): " << alignof(array_float) << std::endl;
std::cout << "address of array_char: " << (void *) array_char << std::endl;
std::cout << "address of array_float: " << array_float << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这段代码的输出是
alignof(array_char): 1
alignof(array_float): 4
array_char 的地址:0x7fff5e8ec580
array_float 的地址:0x7fff5e8ec570
alignof算子的结果在意料之中,但是两个数组的真实地址并不一致。无论我尝试了多少次,地址总是 16 字节对齐。
我在 Ubuntu 16.04 和 Intel CORE i5 第 7 代 …
我写了一个简单的例子:
#include <iostream>
int main() {
void* byte1 = ::operator new(1);
void* byte2 = ::operator new(1);
void* byte3 = malloc(1);
std::cout << "byte1: " << byte1 << std::endl;
std::cout << "byte2: " << byte2 << std::endl;
std::cout << "byte3: " << byte3 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行示例,我得到以下结果:
字节1:0x1f53e70
字节2:0x1f53e90
字节3:0x1f53eb0
每次我分配一个内存字节时,它总是16个字节对齐。为什么会这样?
我在GCC 5.4.0和GCC 7.4.0上测试了此代码,并得到了相同的结果。
CSAPP 解释说,SSE 指令对 16 字节数据块进行操作,并且需要内存地址是 16 的倍数。
但是和栈帧有什么关系呢?这是否意味着SSE指令在堆栈帧上运行?如果有的话,常用的指令是什么?
有温和的解决方案吗?(例如现有的 Mat.proto 文件。)
c++ ×3
alignment ×1
assembly ×1
bash ×1
collections ×1
java ×1
librt ×1
opencv ×1
simd ×1
sse ×1
stack-frame ×1
visual-c++ ×1