小编Gau*_*gal的帖子

C++中的函数指针vs仿函数

使用函子和函数指针有什么区别.例如

  //Functor
  struct add_x
  {
    int x;
    add_x(int y):x(y){}
    int operator()(int y)
    {
       return x+y;
    }
  };
  //Function
  int (func)(int x)
  {
     return ++x;
  }
  std::vector<int> vec();
  //fill vec with 1 2 3 4 5
  int (*f)(int) = func;//Function pointer
  std::transform(vec.begin(),vec.end(),f); //approach 1
  std::transform(vec.begin(),vec.end(),add_x(1)); //approach 2
Run Code Online (Sandbox Code Playgroud)

这两种方法都有效,但我确信会有一种方法比其他方法更受欢迎(或可能).

c++ function-pointers functor

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

IMAGE_SECTION_HEADER 的 VirtualAddress 和 PointerToRawData 的区别

文章中,定义

DWORD VirtualAddress

在 EXE 中,此字段保存 RVA 到加载程序应将部分映射到的位置。要计算内存中给定节的实际起始地址,请将图像的基地址添加到存储在此字段中的节的 VirtualAddress。

DWORD PointerToRawData

这是可以找到编译器或汇编器发出的原始数据的基于文件的偏移量。如果您的程序内存映射 PE 或 COFF 文件本身(而不是让操作系统加载它),则该字段比 VirtualAddress 字段更重要。在这种情况下,您将拥有一个完全线性的文件映射,因此您将在此偏移量处找到节的数据,而不是在 VirtualAddress 字段中指定的 RVA

RVA被定义为

PE 文件中的许多字段都是根据 RVA 指定的。RVA 只是某个项目的偏移量,相对于文件的内存映射位置

要将 RVA 转换为可用指针,只需将 RVA 添加到模块的基地址即可。基地址是内存映射的 EXE 或 DLL 的起始地址

手头的问题是到达import sectionPE 文件。

hFile = CreateFile(..);
hFileMapping = CreateFileMapping(..);
lpFileBase = MapViewOfFile(..);
ImageBase = (PIMAGE_DOS_HEADER)lpFileBase;
PEHeader = (ImageBase + ImageBase->e_lfanew);
Run Code Online (Sandbox Code Playgroud)

现在要掌握 import table

PIMAGE_OPTIONAL_HEADER PEImageOptionalHeader = &(PEHeader->OptionalHeader);
IMAGE_DATA_DIRECTORY importTable = PEImageOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; 
Run Code Online (Sandbox Code Playgroud)

由于importTable.VirtualAddress是 RVA,为了获得可用的指针,我可以添加图像文件的基础。

所以ImageBase …

c++ windows portable-executable

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

删除元素后,std :: string容量保持不变,那么它是否会占用一些内存?

以下代码:

string a = "abc";
cout << a.capacity();
a.erase(a.begin() + 1, a.end());
cout << a.capacity();
Run Code Online (Sandbox Code Playgroud)

...输出:

33
Run Code Online (Sandbox Code Playgroud)

即使我从字符串中删除了一些元素,容量也保持不变.所以我的问题是:

  1. 由于容量,一些内存是否被阻止?如果我没有明确表示reserve()怎么办?

  2. 如果我使用reserve()并且最终没有使用整个容量,我是否在浪费内存?

  3. 如果需要,这个额外的内存(我没有使用)会被分配给其他东西吗?

编辑:假设我有

 string a= "something";
 a = "ab";
Run Code Online (Sandbox Code Playgroud)

现在我知道a不会超过两个字符.所以打电话reserve(2)让记忆不浪费是明智的吗?

c++

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

指向c中的数组的指针不起作用

char (*ptr)[10];
scanf("%s",ptr);//inputing a string
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?据我说这应该工作,因为ptr是一个指向字符数组的指针.

c pointers

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

64位变量在c ++中奇怪地起作用

为什么64位变量在真正的位进入第31位并且进一步变得更加明显?在第32位它返回一个非常大的值然后重置.

#include <iostream>
using namespace std;
int a[65];
int main()
{
a[0]=1;
for(int i=0;i<=63;++i)
{
    for(int k=7;k>=0;--k)
    {
     for(int j=7;j>=0;--j)
    cout<<a[k*8+j];
    cout<<' ';
    }
    cout<<'=';
    cout<<(unsigned long long)(1<<i);
    cout<<'\n';
        a[i]=0;
        a[i+1]=1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ bits

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