小编srk*_*ing的帖子

Core i7中每核L2和L3之间的互连

英特尔酷睿i7具有每核L1和L2高速缓存以及大型共享L3高速缓存.我需要知道哪种互连将多个L2连接到单个L3.我是学生,需要编写缓存子系统的粗略行为模型.它是横梁吗?一辆公共汽车?戒指?我遇到的参考文献提到了缓存的结构细节,但没有一个提到存在什么样的片上互连.

谢谢,

-neha

x86 computer-architecture cpu-cache

4
推荐指数
1
解决办法
315
查看次数

如何最好地控制迭代方向?

我有一个大型对象的容器,复制起来很昂贵.我有时必须正常地迭代整个容器,有时反过来.一旦我确定了迭代方向,我就不需要改变飞行中途,即不需要随机访问.

我希望做这样的模式:

#include <iostream>
#include <vector>
using namespace std;
int main( int argc, char** )
{
    // pretend this is a vector of expensive objects
    vector<int> foo = {1,2,3,4,5};

    // calculate forward or backward iteration direction
    bool backwards = (argc > 1);

    if( backwards )
        // prepare backward iteration, but don't copy objects
    else
        // prepare forward iteration, but don't copy objects

    for( auto& i : /* either forward or backward */ )
    {
        // my loop body
        cout << …
Run Code Online (Sandbox Code Playgroud)

c++ iteration c++11

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

C externs别名相同的地址?

C编译器是否可以假设两个不同的extern全局变量不能别名到同一个地址?

在我的情况下,我有这样的情况:

extern int array_of_int[], array_end;

void some_func(void)
{
    int *t;
    for (t = &array_of_int[0]; t != &array_end; t++)
    {
    ...

通过优化编译生成的二进制文件不会测试

t != &array_end
进入循环之前的条件.编译器的优化是循环必须至少执行一次,因为在开始时t不能立即相等&array_end.

当然,我们发现这很难.显然,一些带有链接器部分的汇编程序hackery导致两个外部程序是相同地址的情况.

谢谢你的建议!

c global-variables standards-compliance

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

x86二进制膨胀 - 当8位时,32位偏移

我正在使用clang + LLVM 2.9使用-Os选项为x86编译各种工作负载.小二进制大小很重要,我必须使用静态链接.所有二进制文件都是32位.

我注意到,当实际使用8位时,许多指令使用具有32位位移的寻址模式.例如:

89 84 24 d4 00 00 00     mov    %eax,0xd4(%esp)
Run Code Online (Sandbox Code Playgroud)

为什么编译器/汇编器没有选择紧凑的8位位移?

89 44 24 d4              mov    %eax,0xd4(%esp)
Run Code Online (Sandbox Code Playgroud)

实际上,这些浪费的寻址字节超过了我整个二进制文件的2%!

我查看了LLVM的链接时间优化并尝试了--emit-llvm,但它没有提及或帮助解决这个问题.

是否有一些链接时优化可以使用实际位移的知识来选择较小的指令形式?

谢谢你的帮助!

binary optimization x86 llvm

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

Eclipse CDT解析器支持C++ 11?

我在Linux上使用Eclipse 3.7.2和CDT 8.0.2.如何配置CDT以识别c ++ 11语法override?目前,解析器在指示的行上标记虚假错误.由于我在编译器命令行中包含-std = c ++ 11,因此构建完成且没有错误.

class foo
{
public:
    foo(){}
    virtual ~foo(){}
    virtual void func(){}
};

class bar : public foo
{
public:
    bar(){}
    virtual ~bar(){}
    virtual void func() override {} // <--- parser incorrectly flags syntax error
};

int main()
{
    bar my_bar;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我试图在该方向的Eclipse维基这里没有成功.同样,我只需要编辑器的解析器来识别c ++ 11,实际构建就可以了.

c++ syntax-highlighting eclipse-cdt c++11

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

不需要的撇号在Err()中逸出

Err()强制在撇号周围添加“ \”转义符。搜索发现有关此问题的老投诉,但没有明显的解决方法。

如何避免Err字符串中这些注入的撇号转义?

fn bad() -> Result<(), String> {
    return Err("Can't avoid 'apostrophe' escapes.".to_string());
}

fn main() -> Result<(), String> {
    println!("{}", "Can avoid 'apostrophe' escapes.".to_string());
    bad()?;
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

结果是:

Can avoid 'apostrophe' escapes.
Error: "Can\'t avoid \'apostrophe\' escapes."
Run Code Online (Sandbox Code Playgroud)

rust

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

使用 multipeek 将 next() 推进到 peek()

我正在使用 Rust Itertools MultiPeek。如何有效或方便地将 next() 迭代器前进到 peek() 迭代器的当前位置?

fn main() {
    let v = "abcd";
    let mut mp = itertools::multipeek(v.char_indices());
    if let Some((byte_offset, c)) = mp.peek() {
        println!("peek: offset {}, char {}", byte_offset, c);
    }
    if let Some((byte_offset, c)) = mp.peek() {
        println!("peek: offset {}, char {}", byte_offset, c);
    }

    // Update next to current location of peek assuming
    // we'd rather not keep track the number of peeks

    if let Some((byte_offset, c)) = mp.next() {
        // would like to …
Run Code Online (Sandbox Code Playgroud)

rust

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