它们都被用作调用函数,成员函数和通常可调用的任何东西的通用方法.从cppreference我看到的唯一真正的区别是std::invoke函数参数(不管它们是多少)被forward编写到函数中,而std::apply参数作为a传递tuple.这真的是唯一的区别吗?他们为什么要创建一个单独的函数来处理tuples?
我经常{}在模板化的代码中看到这种情况.我不确定我明白它在做什么.例如:
std::enable_if_t<std::is_copy_constructible<T&>{} && !std::is_same<T, MyClass>{}>>
Run Code Online (Sandbox Code Playgroud)
这是什么{}?它是否实例化了这种类型?这意味着什么作为模板参数?
实例化类型的AFAIK意味着创建一个对象.如何在此上下文中创建对象?它只是创建一个虚拟对象?为什么这样?这是什么意思和目的?
通过使用 7zip 在 Windows 中打开许多可执行 ( .exe., .msi) 文件,我注意到许多不同的常见文件类型。这些包括 .text、.data、.bss、.rdata、.pdata 等。我试图获取有关它们的信息,但我无法找出它们的全部含义。以下是其中一些:
.text :代码部分,包含程序的指令-只读-。 .data: 一般用于一些初始化的非零内容的可写数据。因此,数据部分包含可以在应用程序执行期间更改的信息,并且必须为每个实例复制该部分。.bss : 用于初始化为零的可写静态数据。 .rdata : 任何类型的常量/只读数据都存储在这里。 .edata : 导出目录、描述符和句柄 .idata:句柄和描述符的导入目录。可执行文件(exe、dll 等)使用它来指定导入和导出的函数。.rsrc :包含可执行文件所需的各种其他资源的信息的部分,例如在资源管理器中查看可执行文件时显示的图标 还有很多其他的,这是常见的,我找不到任何信息。主要是:.pdata, .tls, .reloc, 证书, .rsrc_1, .aspack, .adata, .INIT, DATA, CODE, .ctors。
rsrc其中大多数都包含一个文件夹,其中包含 BITMAP、CURSOR、ICON、GROUP_CURSOR、GROUP_ICON、MENU、VERSION 等文件夹。
一些可执行文件还包含更多的可执行文件、.html文件、.txt文件等。我还打开了一个根本不包含任何内容的可执行文件(至少用 7zip 打开它没有显示任何内容)![我用7zip打开了它们。]
问题
rsrc文件夹有什么用?它拥有什么样的资源?我将不胜感激,如果您能发布更多关于为什么使用所有这些(尽可能低级别)的信息/链接,以及通常可执行结构应该是什么样子,它应该包含什么等。
这就是全部。
编辑 …
我有一个简单的“Hello World!” 我的桌面上有一个名为 hello.c 的 c 程序:
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我运行以下命令。
到目前为止一切都很好。但是,我无法链接它。除其他命令外,我还尝试过以下命令:
ld -o hello.exe hello.o
ld -o hello.exe hello.o -lgcc
ld -o hello.exe hello.o -nostdlib -lgcc
Run Code Online (Sandbox Code Playgroud)
什么都不起作用。我在每种情况下遇到的链接错误是:
hello.o:hello.c:(.text+0x9): undefined reference to `__main'
hello.o:hello.c:(.text+0x15): undefined reference to `puts'
Run Code Online (Sandbox Code Playgroud)
我如何链接这个汇编程序hello.o以便最终生成可执行程序hello.exe?我缺少什么?[使用 Windows 8.1,Mingw 版本 0.6.2。] 提前致谢。
#include <stdio.h>
struct Header
{
unsigned long long int alignment;
};
int main(void)
{
struct Header header; // note: we can loose the 'struct' in C++
struct Header* pheader = &header;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的程序在C和C++中完美编译.
但是当我将Header结构更改为:
struct {
unsigned long long int alignment;
} Header;
Run Code Online (Sandbox Code Playgroud)
它失败并在C中显示以下消息:
error: storage size of ‘Header’ isn’t known
在C++中:
error: aggregate ‘main()::Header header’ has incomplete type and cannot be defined struct Header header;
在K&R的C编程语言书中,存储分配器的实现中使用了类似的结构.我认为这是一回事,但我知道事实并非如此.我也曾在其他地方见过.我当然更熟悉第一个版本.第二个是什么意思,为什么它甚至存在?有什么不同?
This is my program:
#include <iostream>
#include <string>
#include <locale>
#include <clocale>
#include <codecvt>
#include <io.h>
#include <fcntl.h>
int main()
{
fflush(stdout);
_setmode(_fileno(stdout), _O_U16TEXT);
std::ios_base::sync_with_stdio(false);
std::setlocale(LC_ALL, "el_GR.utf8");
std::locale loc{ "el_GR.utf8" };
std::locale::global(loc); // apparently this does not set the global locale
//std::wcout.imbue(loc);
//std::wcin.imbue(loc);
std::wstring yes;
std::wcout << L"It's all good ???? ???" << L'\n';
std::wcin >> yes;
std::wcout << yes << L'\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Lets say I want to support greek encodings (for both input and output). This program …
从cppreference我们可以看到几个新的过载new和delete,以及new[]和delete[]添加。我在 cppreference 或其他任何地方都找不到任何使用新对齐重载的示例。我已经对它们进行了一段时间的试验,但我不知道如何触发这些对齐的动态分配的调用。任何人都有任何想法,请分享一个例子。
我有以下代码.
typedef pid_t (*getpidType)(void);
pid_t getpid(void)
{
printf("Hello, getpid!\n");
getpidType* f = (getpidType*)dlsym(RTLD_NEXT, "getpid");
return f(); // <-- Problem here
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说called object ‘f’ is not a function.这里发生了什么?我没有以正确的方式声明和使用函数指针f吗?
如果我查看可移植可执行文件的内部结构,该IMAGE_OPTIONAL_HEADER部分内有一个IMAGE_DLLCHARACTERISTICS_NO_ISOLATION字段,正如微软在这里提到的那样,这意味着:“图像是隔离感知的,但不应该被隔离。”。但是,我不明白这里的含义或隐含的含义,也无法找到更多相关信息。此选项也作为 Visual Studio 选项存在,并且在创建 Win32 应用程序项目时默认启用 (VS 2015 C++)。在启用它之前,我想知道它对代码生成有何作用。
如果有人知道,请分享。提前致谢。
我正在学习有关哈希表,哈希地图等我刚刚实施了哈希表在C,与操作:insert(HTable, key),delete(HTable, key),initialize(HTable)和search(HTable, key)。
我想问一件事。由于在(适当的)哈希表中,计算出的哈希索引可能非常大,这是否意味着消耗的空间会像INT_MAX(当然仍然是 O(n))或更多?我的意思是给定我们想要存储在哈希表中的输入元素(即插入它),insert() 函数将调用哈希函数,然后该函数将计算要进入的元素的哈希索引。因此它将使用哈希函数来找到这个索引。
当我们使用哈希函数对元素进行操作时,哈希索引可能会变得非常大。使用适当的,例如加密哈希函数,这个索引可能会变得很大(他们使用 300 位的素数 - Diffie Hellman 公钥密码学等),对吧?我知道在普通的散列函数(例如初学者用来学习的琐碎函数)中,我们应用 mod 操作以使元素适合散列表的边界,但这样做,也许我们限制了散列函数的潜力?
因此,要将元素唯一地映射到哈希表,我们必须使用一个巨大的哈希表。这些加密哈希表是如何实现的?它们必须是完全安全的,对吧?甚至“cryptographichashfunction”上的 Stack Overflow 标签也表示,极不可能找到将映射到同一元素的两个输入(因此冲突的可能性很小)。这不需要将一个巨大的数组存储在内存(或磁盘)中吗?因此,内存消耗将是巨大的。
当然,时间复杂度不是问题。我们只是看到哈希表/数组的起始地址加上索引,然后去内存中的那个地方获取值(O(1) - 哈希表的搜索原理)。
我在某处错了吗?有什么我想念的吗?我希望我说清楚了。总而言之,我想对此进行确认。一个好的散列函数是否需要一个巨大的数组(散列表)以及如此大量的内存才能正确实现?这么多空间是合理的,还是有什么我不太明白的地方?谢谢。
hash cryptography hash-function hashtable cryptographic-hash-function
c++ ×6
c ×3
windows ×3
gcc ×2
alignment ×1
assembly ×1
c++17 ×1
callable ×1
cryptographic-hash-function ×1
cryptography ×1
exe ×1
executable ×1
facet ×1
glibc ×1
hash ×1
hashtable ×1
linker ×1
linux ×1
locale ×1
mingw ×1
new-operator ×1
overloading ×1
struct ×1
templates ×1
type-traits ×1
types ×1
winapi ×1
x86-64 ×1