我想证明没有什么是(受保护的内存地址),整个故事只是关于编译器、操作系统或托管应用程序运行的任何应用程序,只需对托管的读写请求进行一些检查应用程序发送到它的上级进程,这个上级应用程序或你称之为什么决定这个子进程是否有权读取或写入这个特定的内存位置,但是这个 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++ 并执行此代码
#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++ 移动语义应该节省处理器能力和内存,因为
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)
唯一的区别当然是清空数据和移动构造中的大小,因此在内存和性能方面,上面两段代码之间是否有任何性能改进,因为清空数据指针和大小实际上并没有节省我们的空间或内存对,或者我想念这里的东西。
这个问题使我可以知道何时使用浅复制或移动语义,以及它们之间是否有任何区别(除了以移动方式将属性归零)。
我正在读一本关于汇编(中级)的书,它提到了一些指令,比如xchg
自动断言处理器 LOCK# 信号。在网上搜索它发现它赋予处理器任何共享内存的专有权,但没有具体细节。这让我想知道这个权利是如何运作的。