fork download
  1. #include <iostream>
  2. #include <cstring>
  3. #include <iomanip>
  4.  
  5. // 打印内存内容的工具函数
  6. void hexdump(const void* addr, size_t len) {
  7. const uint8_t* p = static_cast<const uint8_t*>(addr);
  8. std::cout << "Address | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n";
  9. std::cout << "---------|------------------------------------------------\n";
  10. for (size_t i = 0; i < len; i += 16) {
  11. std::cout << reinterpret_cast<const void*>(p + i) << " | ";
  12. for (int j = 0; j < 16 && (i + j) < len; ++j) {
  13. std::cout << std::hex << std::setw(2) << std::setfill('0')
  14. << static_cast<int>(p[i + j]) << " ";
  15. }
  16. std::cout << "\n";
  17. }
  18. }
  19.  
  20. int main() {
  21. // 64字节对齐的缓冲区(避免实验噪声)
  22. alignas(64) uint8_t buffer[32];
  23. memset(buffer, 0xAA, sizeof(buffer)); // 填充初始值 0xAA
  24.  
  25. // 在地址 0x6 处强制放置 int64_t(跨越 0x0~0x7 和 0x8~0xF 两个 8 字节块)
  26. int64_t* unaligned_ptr = reinterpret_cast<int64_t*>(buffer + 6);
  27. *unaligned_ptr = 0x1122334455667788; // 写入测试值
  28.  
  29. // 转储内存,观察写入位置和总线读取行为
  30. std::cout << "=== 内存转储 (写入地址 0x6~0xD) ===\n";
  31. hexdump(buffer, 32);
  32.  
  33. // 验证读取操作是否成功
  34. volatile int64_t read_value = *unaligned_ptr; // volatile 阻止编译器优化
  35. std::cout << "\n读取值: 0x" << std::hex << read_value << std::endl;
  36.  
  37. return 0;
  38. }
Success #stdin #stdout 0.01s 5292KB
stdin
Standard input is empty
stdout
=== 内存转储 (写入地址 0x6~0xD) ===
Address  | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------|------------------------------------------------
0x7ffcd9a17500 | aa aa aa aa aa aa 88 77 66 55 44 33 22 11 aa aa 
0x7ffcd9a17510 | aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 

读取值: 0x1122334455667788