小编Kha*_*led的帖子

c++ 编译器是否保护常量内存地址不受任何更改?

我想证明没有什么是(受保护的内存地址),整个故事只是关于编译器、操作系统或托管应用程序运行的任何应用程序,只需对托管的读写请求进行一些检查应用程序发送到它的上级进程,这个上级应用程序或你称之为什么决定这个子进程是否有权读取或写入这个特定的内存位置,但是这个 C++ 代码在本质上不起作用,为什么:

#include <iostream>
int main()
{
    const int x = 10;
    std::cout << &x << std::endl; // So i can view address of x
    std::cout << "x Before is equal "<< x <<std::endl;

    int y ;
    std:: cin >> std::hex >>y;

    int *pinter = (int*)y ;
    *pinter = 20;
    std::cout << "x After is equal "<< x <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这段代码应该绕过 c++ 编译器将 x 变量类型设置为const int的概念,这样指向变量的指针(不像在 C 中,指向常量的指针可以改变 constant 的值)和对变量的引用都不能改变变量所以这段代码应该得到变量 x 的地址(当然在它打印出来之后)然后一个指针完成剩下的工作,所以我在这里搞砸了,因为它看起来像这个内存位置是硬件保护的(我知道不是,但我很困惑)

c++ pointers constants

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

为什么堆栈和堆在内存中分离得如此之多?

我正在学习 C++ 并执行此代码

#include<stdio>
using namespace std;

int main(){

    char* buffer = new char[5];
    printf("%p", &buffer);                // 000000000061fe10
    cout<<endl;
    printf("%p", buffer);                  // 0000000000796b700
}
Run Code Online (Sandbox Code Playgroud)

给了我 2 个完全分离的内存位置,我的意思是大约 150 万字节远,那么为什么堆大小应该是 5 个字节,对吗?char size * 5. 堆向下增长(从 0xFFF ... 到 0x0000 ...) 堆下有堆栈,所以差异应该小得多,所以在这种情况下什么是内存布局。什么是我在上面的解释中不完全理解的

c++ stack heap-memory

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

c ++移动语义是否在每种情况下都节省资源?

我知道 C++ 移动语义应该节省处理器能力和内存,因为

Move::Move(Shallow&& source) noexcept      // Move constructor
{
    data = source.data;       // Assume data is an array of size = size and all initiated to a user specific value
    size = source.size;
    source.size =0;
    source.data ={nullptr};
}
Run Code Online (Sandbox Code Playgroud)

假设所有数组索引都被初始化为一个特定的变量,这样移动语义只会将数组指针保存在内存中,并将源数组清空,就像上面的例子一样,这将阻止动态创建新数组,如果我们使用复制构造函数(特定的深复制构造函数)但是

1) 如果我们假设数据只是一个简单的整数,甚至是一个非常大的未初始化数组,那么使用移动构造函数是否有任何好处 2) 这个移动构造函数看起来与仅使用浅复制调用复制构造函数非常相似,例如

Copy::Copy(const &source){        // A shallow copy
        data = source.data;       // Assume data is an array of size = size
        size = source.size;
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别当然是清空数据和移动构造中的大小,因此在内存和性能方面,上面两段代码之间是否有任何性能改进,因为清空数据指针和大小实际上并没有节省我们的空间或内存对,或者我想念这里的东西。

这个问题使我可以知道何时使用浅复制或移动语义,以及它们之间是否有任何区别(除了以移动方式将属性归零)。

c++ move copy-constructor

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

什么是处理器 Lock# 信号及其工作原理?

我正在读一本关于汇编(中级)的书,它提到了一些指令,比如xchg自动断言处理器 LOCK# 信号。在网上搜索它发现它赋予处理器任何共享内存的专有权,但没有具体细节。这让我想知道这个权利是如何运作的。

  1. 这是否意味着任何其他计算机设备(如 GPU 或其他设备)无法访问内存。实际上,其他设备可以直接与 RAM 通信,而无需先通过 CPU。
  2. 处理器如何知道它处于这种锁定状态,例如它是否保存在控制或 rflags 寄存器中,或者因为我在拥有多核 CPU 时无法看到此操作是如何工作的。
  3. 我访问的网站说锁定任何共享内存。这是否意味着在此锁定期间,整个 RAM 被锁定,或者仅锁定执行指令的内存页(或部分内存而不是全部)。

x86 assembly atomic cpu-architecture x86-16

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