C++ 与指针算法混淆

C++ 与指针算法混淆,c++,pointer-arithmetic,C++,Pointer Arithmetic,有人能帮我理解这两条线在做什么吗 buf = (char *)(malloc(2 * pagesize) & pagemask); buf = (char *)(((long)buf + pagesize) & ∼pagemask); 我理解malloc,但不确定&操作试图在这两个表达式中实现什么 Pagesize和pagemask的定义如下 pagesize = sysconf(_SC_PAGESIZE); pagemask = pagesize - 1; 谢谢 Edit1

有人能帮我理解这两条线在做什么吗

buf = (char *)(malloc(2 * pagesize) & pagemask);
buf = (char *)(((long)buf + pagesize) & ∼pagemask);
我理解malloc,但不确定
&
操作试图在这两个表达式中实现什么

Pagesize和pagemask的定义如下

pagesize = sysconf(_SC_PAGESIZE);
pagemask = pagesize - 1;
谢谢

Edit1

这段代码来自Steve D.Pate的《Unix文件系统》一书

Edit2

这是完整的代码

#include <sys/unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include “sys/fs/vx_ioctl.h”

#define MB (1024 * 1024)

main(int argc, char argv[])
{
    char        *buf;
    int         i, fd, advisory;
    long        pagesize, pagemask;

    if (argc != 2) {
        exit(1);
    }
    if (strcmp(argv[1], “VX_SEQ”) == 0) {
        advisory = VX_SEQ;
    } else if (strcmp(argv[1], “VX_RANDOM”) == 0) {
        advisory = VX_RANDOM;
    } else if (strcmp(argv[1], “VX_DIRECT”) == 0) {
        advisory = VX_DIRECT;
    }
    pagesize = sysconf(_SC_PAGESIZE);
    pagemask = pagesize - 1;
    buf = (char *)(malloc(2 * pagesize) & pagemask);
    buf = (char *)(((long)buf + pagesize) & ∼pagemask);

    fd = open(“myfile”, O_RDWR);
    ioctl(fd, VX_SETCACHE, advisory);
    for (i=0 ; i<MB ; i++) {
         read(fd, buf, 4096);
    }
}
#包括
#包括
#包括
#包括“sys/fs/vx_ioctl.h”
#定义MB(1024*1024)
main(int argc,char argv[])
{
char*buf;
int i,fd,咨询;
长页面大小,页面掩码;
如果(argc!=2){
出口(1);
}
如果(strcmp(argv[1],“VX_SEQ”)==0){
咨询=VX_-SEQ;
}else if(strcmp(argv[1],“VX_RANDOM”)==0){
咨询=VX_随机;
}否则如果(strcmp(argv[1],“VX_DIRECT”)==0){
咨询=VX_直接;
}
pagesize=sysconf(_SC_pagesize);
pagemask=pagesize-1;
buf=(char*)(malloc(2*pagesize)和pagemask);
buf=(字符*)((长)buf+pagesize)和∼页面掩码);
fd=打开(“我的文件”,O_RDWR);
ioctl(fd、VX_设置缓存、咨询);
对于(i=0;i初始注释
  • 内存“页面”的大小总是(实际上总是)2的幂。这意味着,对于给定的页面大小,地址的高位表示页面,低位表示页面的偏移量
  • 不要编写此类代码。进行显式转换;使用多个更简单的指令;尝试使用更有意义的变量名(例如,
    offset\u into\u page=((const uintpttr)address)&page\u mask;
    )等等
一线 第一行执行以下操作:

  • 分配2页的内存
  • 将地址视为一个数字,仅将偏移量的位保留在分配区域开始的页面内
  • 我不清楚这为什么有用

    第二线 第二行执行以下操作:

  • buf
    的地址视为一个数字(尽管是以一种扭曲、容易出错且不可移植的方式)
  • buf
    的地址向前移动一页
  • 保持地址的页位-在buf内获得第一个页边界对齐地址

  • 这会牺牲为
    buf
    分配的一些空间,使其对齐(并将其保存在实际分配的空间中。

    代码和代码是二进制的,并且是二进制的。调用
    malloc
    并立即对结果进行算术运算似乎不是一个好主意。稍后,您需要将原始指针传递到
    free
    。选择一个随机数,您认为
    malloc
    可能返回的值。然后编写i写在纸上。然后用笔和纸执行第二个操作。对几个不同的数字这样做,你可能会看到一个模式。笔和纸是程序员工具箱中两个非常重要的部分,仍然很酷。我理解你解释的大部分内容。我仍然困惑的是以下几点。在完成第一个任务后,我会ldn你不是把指针弄乱了吗,因为你丢弃了页面位,只保留了偏移位?因此在第二行中,你会指向malloc没有分配的空间?@AbdulRahman:等等,这两个赋值应该是一个接一个地发生的?我以为它们是不相关的……会用我输入的代码更新问题有关函数,请参见手册中的