使用函子和函数指针有什么区别.例如
//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)
这两种方法都有效,但我确信会有一种方法比其他方法更受欢迎(或可能).
在此文章中,定义
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 …
以下代码:
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)
即使我从字符串中删除了一些元素,容量也保持不变.所以我的问题是:
由于容量,一些内存是否被阻止?如果我没有明确表示reserve()怎么办?
如果我使用reserve()并且最终没有使用整个容量,我是否在浪费内存?
如果需要,这个额外的内存(我没有使用)会被分配给其他东西吗?
编辑:假设我有
string a= "something";
a = "ab";
Run Code Online (Sandbox Code Playgroud)
现在我知道a不会超过两个字符.所以打电话reserve(2)让记忆不浪费是明智的吗?
char (*ptr)[10];
scanf("%s",ptr);//inputing a string
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?据我说这应该工作,因为ptr是一个指向字符数组的指针.
为什么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)