相关疑难解决方法(0)

现代x86硬件可以不将单个字节存储到内存中吗?

说到C++的并发内存模型,Stroustrup的C++编程语言,第4版,第1节.41.2.1,说:

...(像大多数现代硬件一样)机器无法加载或存储任何小于单词的东西.

但是,我的x86处理器,几年前,可以存储小于一个字的对象.例如:

#include <iostream>
int main()
{
    char a =  5;
    char b = 25;
    a = b;
    std::cout << int(a) << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果没有优化,GCC将其编译为:

        [...]
        movb    $5, -1(%rbp)   # a =  5, one byte
        movb    $25, -2(%rbp)  # b = 25, one byte
        movzbl  -2(%rbp), %eax # load b, one byte, not extending the sign
        movb    %al, -1(%rbp)  # a =  b, one byte
        [...]
Run Code Online (Sandbox Code Playgroud)

评论是由我提出的,但是汇编是由GCC提出的.当然,它运行良好.

显然,我不明白Stroustrup在谈到硬件可以加载和存储任何小于一个单词的内容时所说的内容.据我所知,我的计划什么也不做,但加载和存储对象小于一个字的.

C++对零成本,硬件友好的抽象的彻底关注使C++与其他易于掌握的编程语言区别开来.因此,如果Stroustrup在公交车上有一个有趣的信号心理模型,或者有其他类似的东西,那么我想了解Stroustrup的模型.

什么 Stroustrup谈论,拜托?

更长时间的背景声明 …

c++ concurrency x86 assembly memory-model

25
推荐指数
2
解决办法
1869
查看次数

对齐和未对齐的内存访问?

对齐和未对齐的内存访问有什么区别?

我在TMS320C64x DSP上工作,我想使用内部函数(汇编指令的C函数),它有

ushort & _amem2(void *ptr);
ushort & _mem2(void *ptr);
Run Code Online (Sandbox Code Playgroud)

_amem22字节的对齐访问在哪里进行_mem2未对齐访问.

我什么时候应该使用哪个?

c c++ memory memory-alignment omap

18
推荐指数
4
解决办法
2万
查看次数

char数组上的C++内存模型和竞争条件

基本上我无法理解这一点:(来自Bjarne FAQ)

但是,大多数现代处理器不能读取或写入单个字符,它必须读取或写入整个单词,因此对c的赋值实际上是"读取包含c的单词,替换c部分,然后再将单词写回". '由于对b的赋值是相似的,所以即使线程没有(根据它们的源文本)共享数据,两个线程也有很多机会相互冲突!

那么char数组如何在元素之间没有3(7?)字节填充的情况下存在?

c++ memory-model race-condition c++11

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

如果内存组织为字,为什么程序计数器增加 1,而在字节的情况下增加 2?

如果在计算机中,一条指令是 16 位的,并且内存是按 16 位字组织的,那么下一条指令的地址是通过在当前指令的地址中加一个来计算的。如果内存是按字节组织的,可以单独寻址,那么我们需要在当前指令地址上加两个,得到下一条要依次执行的指令的地址。为什么会这样??请解释这个概念。我是计算机组织和汇编语言编程的新手,因此不胜感激。谢谢。

memory assembly cpu-architecture

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

内存地址是否指向一个字节的信息?

以下是DTS文件的摘录.LINUX /拱/的PowerPC /引导/ DTS/[board_name] .dts

memory {
    device_type = "memory";
    reg = <0x00000000 0x40000000>;  // 1GB at 0
};
Run Code Online (Sandbox Code Playgroud)

嵌入式设备有1 GB的内存.

0x40000000 = 1073741824(十进制).

我得到1 GB的唯一方法是当我计算1073741824作为字节.

这意味着1073741824字节= 1GB.

这是否意味着0x00000000指向RAM中的一个字节数据?换句话说,RAM中的每个字节都有一个地址.

为什么会这样?我们读了8位块?为什么不说一句话?

ram memory-management linux-kernel embedded-linux device-tree

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