小编jin*_*nge的帖子

librt.so 是什么?如何直接使用?

我发现有些图书馆链接到librt.so,而其他图书馆则没有。我想知道它是在什么情况下链接的。

我从来没有直接使用过这个库。有没有演示显示它的直接用法?有没有相关的头文件?

librt

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

Java中是否存在任何无序,可重复的Collection类?

我想要一个包含无序,可重复项目的集合.在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)

也就是说,我希望每次都能得到一个项目.我怎样才能实现它?

java collections

6
推荐指数
2
解决办法
1028
查看次数

vftable[0] 存储的是第一个虚拟函数还是 RTTI 完整对象定位器?

我们知道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 …

c++ assembly visual-c++ visual-studio-2015

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

bash中'let'的一个奇怪错误

我想知道下面的代码是否有错误的语法?

#!/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

为什么会发生?

bash

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

为什么在我的实现中所有数组都对齐到 16 个字节?

我非常简单的代码如下所示

#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 代 …

c++ memory-alignment

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

为什么动态分配的内存总是16字节对齐?

我写了一个简单的例子:

#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上测试了此代码,并得到了相同的结果。

c++ memory-alignment dynamic-memory-allocation

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

为什么堆栈帧的长度是 16 字节的倍数?

CSAPP 解释说,SSE 指令对 16 字节数据块进行操作,并且需要内存地址是 16 的倍数。

但是和栈帧有什么关系呢?这是否意味着SSE指令在堆栈帧上运行?如果有的话,常用的指令是什么?

sse simd alignment memory-alignment stack-frame

3
推荐指数
1
解决办法
959
查看次数

如何使用 protobuf 序列化 cv::Mat 对象?

有温和的解决方案吗?(例如现有的 Mat.proto 文件。)

opencv protocol-buffers

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