我试图通过 FileMapping 在两个应用程序之间传输数据 - 一切正常。
但是问题来了:当我从一个应用程序写入共享内存时,我如何在第二个应用程序中理解它,我应该什么时候读取它?例如,如果它是通过套接字进行的数据传输,那么很清楚 - 我正在执行条件发送,在传入请求的接收端触发回调,但使用 FileMapping 就不清楚了。
我试图通过 FileMapping 在两个应用程序之间传输数据 - 一切正常。
但是问题来了:当我从一个应用程序写入共享内存时,我如何在第二个应用程序中理解它,我应该什么时候读取它?例如,如果它是通过套接字进行的数据传输,那么很清楚 - 我正在执行条件发送,在传入请求的接收端触发回调,但使用 FileMapping 就不清楚了。
您能否告诉我是否可能或如果可能,如何通过引用将变量传递给函数?
像这样:
function my_func(my_int) //Передать указатель или ссылку
my_int =555
end
function main()
my_int =5
my_func(my_int)
message(tostring(my_int)) --хочу увидеть измененное значение
end
我忘记了我的 Google 帐户密码。登录 Gmail 和 YouTube 是自动的(密码保存在浏览器中),但密码本身不会显示。
这是我的问题:如果谷歌浏览器保存了密码,有什么方法可以查看密码吗?
笼统地告诉我,但是 Linux 如何移植到其他架构?毕竟,Linux 最初是为 x86 编写的。
由于 Linux 似乎是用 C/C++ 编写的,所以最笼统和粗略的说法我认为 C 代码只是简单地重写了——即所有 C 函数的代码都简单地从 x86 汇编器重写为它被移植到的体系结构,并且基本上全部。
移植实际上是如何工作的?
从初学者那里寻找关于这个主题的建议和答案,我就是 - 为什么开始学习 OpenGL 或 Vulkan,在大多数情况下,一般答案是:
OpenGL 已经被移植并且现在可以工作了,甚至可以粗略地说是在一个茶壶上,而 Vulkan 是一个新的规范,还有很多尚不支持。
一切似乎都是如此,但我有一个问题,为什么会这样?仅仅因为 Vulkan 是新的,而傻瓜还没有为 Vulkan 编写驱动程序吗?
实际上,从理论上讲,对于开发人员来说,为 Vulkan 编写驱动程序似乎比为 OpenGL 编写驱动程序更容易。或者不是吗?
或者 Vulkan 规范可能不适合旧的、过时的“假人”和视频卡,因此 Vulkan 将永远无法在那里工作?
打扰一下,请告诉我为什么或为什么在设置值的_mm_set_epi32函数中-设置是否以相反的顺序进行?
__m128i _mm_set_epi32(int e3,int e2,int e1,int e0)
使用提供的值将压缩的 32 位整数设置为 dst。
Operation:
dst[31:0] := e0
dst[63:32] := e1
dst[95:64] := e2
dst[127:96] := e3
也就是说,从描述中可以看出,如果我这样做:
__m128i my_m128i = _mm_set_epi32 (0, 1, 2, 3);
值将被输入到向量中,好像不是从左到右,就像通常在初始化时所做的那样,例如,一个数组,反之亦然。
为什么会有这样的“混乱”?
你能告诉我如何从另一个向量中按值重置向量的某些字节吗?
嗯,也就是说,有两个向量:
int main()
{
__m128i my_m128i = _mm_set_epi32(7, 6, 5, 4);
__m128i my_m128i_mask = _mm_set_epi32(0, 1, 1, 0);
}
如何根据my_m128i_mask向量值使my_m128i向量向量的值7和4为零?
我通过乘法思考,例如将两个向量的每个 32 位相乘并自动得到零。但是在英特尔中没有找到这样的“功能”。
只找到这些:
_mm_mul_pd:将 a 和 b 中的压缩双精度(64 位)浮点元素相乘并将结果存储在 dst 中。
_mm_mul_epi32:将 a 和 b 中每个打包的 64 位元素中的 32 位最小符号整数相乘,并将有符号的 64 位结果存储在 dst 中。
将向量 __m128i 的第 4 个 32 位乘以另一个向量 __m128i 的第 4 个 32 位的“函数”是什么,我没有找到。
也许还有另一种方法可以将掩码归零?
抱歉,但我无法从描述中理解此 SIMD 指令的作用:https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#ig_expand=7350 ,4869 ,514,6791,5444,5393,5260,101,152,101,6929,7101,121,7350,7332,1941&text=_mm_cvtepu8_epi32
mm_cvtepu8_epi32:
__m128i _mm_cvtepu8_epi32 (__m128i a)
零将 a 中的压缩无符号 8 位整数扩展为压缩 32 位整数,并将结果存储在 dst 中。
Zero 将 a 中压缩的 8 位无符号整数扩展为压缩的 32 位整数,并将结果存储在 dst 中。
也就是说,它将 __m128i 向量作为输入并返回相同的 __m128i 向量。它是什么样的?
将压缩的 8 位整数扩展为压缩的 32 位整数是什么意思?我就是想不通。__m128i 16 个字节,因为它们是 - 所以它们保留在输出中。
请告诉我如何从相同类型的向量中添加值,但这些值本身被这些向量中不同数量的字节占用。
这是一个例子:
int main()
{
//--------------------------------------------------------------
int my_int_sequence[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
__m128i my_int_sequence_m128i_1 = _mm_loadu_si128((__m128i*) & my_int_sequence[0]);
__m128i my_int_sequence_m128i_2 = _mm_loadu_si128((__m128i*) & my_int_sequence[4]);
__m128i my_int_sequence_m128i_3 = _mm_loadu_si128((__m128i*) & my_int_sequence[8]);
__m128i my_int_sequence_m128i_4 = _mm_loadu_si128((__m128i*) & my_int_sequence[12]);
//--------------------------------------------------------------
//-----------------------------------------------------------------------
char my_char_mask[16] = { 1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,1 };
__m128i my_char_mask_my_m128i = _mm_loadu_si128((__m128i*) &my_char_mask[0]);
//-----------------------------------------------------------------------
}
也就是说,我在 my_int_sequence 数组中有一个 int 值数组——并且由于所有 16 个 int 值都无法放入一个 __m128i 向量中,因此我将这些值 4 个值加载到第 4 个 __m128i 向量中。
我还有一个 16 字节的数组,我也将它加载到 my_char_mask_my_m128i 向量中。
现在我想添加到 my_int_sequence_m128i_x 向量的每个 4 字节值,就好像来自 my_char_mask_my_m128i 向量的相应一字节值一样。
问题显然是我需要把不同的维度加起来。可能吗?
也许我需要向量 my_char_mask_my_m128i 的每个字节 - 如何将其转换为 4 个字节?
我试图至少在最原始的层面上理解如何使用 SIMD。我发现这篇文章:https ://woboq.com/blog/utf-8-processing-using-simd.html
有一个简单的代码和解释,但我想不通:
int fromUtf8(const char *src, int len, unsigned short *dst)
{
//Мы будем обрабатывать ввод по 16 байт за раз, поэтому длина должна быть не менее 16.
while(len >= 16)
{
//Загрузить 128 бит в векторный регистр. Мы используем встроенный 'loadu', где «u» означает не выровненный. Загрузка выровненных данных намного быстрее, но здесь мы не знаем, выровнен ли источник.
__m128i chunk = _mm_loadu_si128(reinterpret_cast<const __m128i*>(src));
//Определить, является ли это ASCII, проверив, установлен ли старший бит одного байта:
if (!_mm_movemask_epi8(chunk))
{
//....
}
}
在这段代码中,我无法理解 - auto 文章写道,fromUtf8 函数需要一个指向 char * 的指针,其中有 16 位或 2 个字节。
但是现在文章 auto 使用了 _mm_loadu_si128 SIMD 函数,它将 128 位或 16 字节加载到寄存器中 - 根据指定的 src 源,但 src 只有 2 个字节长。
有可能这样做吗?_mm_loadu_si128 不会将垃圾加载到寄存器中,这将在 src 源中的 2 个字节之后?
请告诉我,std::deque 有一个“.at”方法——它提供对元素的访问。
“at”和迭代器访问之间有区别吗?
这是一个例子:
std::deque<int>::iterator deq_iterator = my_deq.begin();
for (int i = 0; i < my_deq.size(); i++)
{
std::cout << *deq_iterator << std::endl;
deq_iterator++;
}
...
for (int i = 0; i < my_deq.size(); i++)
{
std::cout << my_deq.at(i) << std::endl;
}
然后在第一种情况下,遍历元素的循环将是高效的,也就是说,要访问下一个 i 元素,它将从前一个迭代器开始,每次循环迭代都会增加一个,而不是每次都从队列的零元素开始。
但是在使用“at”方法时是否也会这样做,或者在这种情况下,每次访问第 i 个洗脱液时都会从队列的零元素中寻找?
问题可能不在stackoverflow规则之内,而只是想知道在编译器中实现它会有多困难-以结构字段数量为单位确定结构大小的方法以及以a访问它们的能力环形?
只是最近在 C++ 中添加了很多东西,但他们无论如何都不会添加它 - 对我来说,这将是一个有用的功能。或者可能不是。
请告诉我为什么访问CURLMsg结构的字段时会出现访问错误:
这是我正在使用的简单代码:
#include <iostream>
#include <string>
#include <curl.h>
int main()
{
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl;
if (curl == CURL_OK)
{
CURLcode curl_easy_setopt_status;
curl_easy_setopt(curl, CURLOPT_URL, "https://www.cyberforum.com"); //сайт с заведомо некорректным сертификатом
curl_easy_setopt_status = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); //Установка редиректа
curl_easy_setopt_status = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10); //Установка кол-ва редиректов
curl_easy_setopt_status = curl_easy_setopt(CURL_p, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_setopt_status = curl_easy_setopt(CURL_p, CURLOPT_SSL_VERIFYHOST, 1);
//Запуск http-запроса: ------->
CURLM* multi_handle;
CURLMcode CURLMcode_;
int still_running = 0;
multi_handle = curl_multi_init();
curl_multi_add_handle(multi_handle, curl);
CURLMcode_ = curl_multi_perform(multi_handle, &still_running);
CURLMsg* my_CURLMsg_multi_info_read; //Структура возвращаемая функцией curl_multi_info_read.
int my_msgs_in_queue_int;
while (still_running != 0)
{
CURLMcode_ = curl_multi_perform(multi_handle, &still_running);
if (CURLMcode_ == 0)
{
CURLMcode_ = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
}
else
{
break;
}
my_CURLMsg_multi_info_read = curl_multi_info_read(multi_handle, &my_msgs_in_queue_int); //Запрашиваю структуру CURLMsg.
if (my_CURLMsg_multi_info_read != 0) //Если указатель действительный, то:
{
if (my_CURLMsg_multi_info_read->msg == CURLMSG_DONE)
{
//Теперь пытаюсь обратится к первому байту поля whatever:
std::cout << "whatever_address:" << my_CURLMsg_multi_info_read->data.whatever <<std::endl; //АДРЕСС НЕ НУЛЕВОЙ, то есть указатель действительный.
std::cout << "whatever:" << ((char*)(*my_CURLMsg_multi_info_read).data.whatever)[0] << std::endl; //ТУТ я терплю ОШИБКУ ДОСТУПА! Почему же так?
}
}
}
return 0;
}
CURLMSG 结构本身如下所示:
struct CURLMsg
{
CURLMSG msg; // what this message means == CURLMSG_DONE
CURL* easy_handle; // the handle it concerns
union
{
void* whatever; // message-specific data
CURLcode result; // return code for transfer
} data;
};
如果该字段 - 一个指向 void 的指针 - 被分配了一个地址,那么这意味着至少可以访问 1 个字节,那么我应该有,为什么会发生访问错误?
请告诉我,这个sister子有一个http头:Content-Type,例如,值可以是:charset=utf-8
告诉我,charset= 和 encoding 之间可以有一个空格或两个空格吗?找不到监管与否。
请告诉我,是否有可能在 Libcurl 中以某种方式查看请求服务器时生成的标头?
请告诉我,Libcurl 文档说 curl_global_init () 函数:
此函数必须在程序中至少调用一次。
和
这个函数不是线程安全的。当程序中的任何其他线程(即共享相同内存的线程)正在运行时,您不得调用它。
这个函数不是线程安全的。当程序中的任何其他线程正在运行时(即使用相同内存的线程),您不应该调用它。
我似乎分别理解了这些词,但总的意思不知何故没有达到。“当程序中的任何其他线程正在运行时,您不得调用它”是什么意思?
也就是说,如果我在代码中至少创建了一个线程,并且在这个线程中执行了任何操作,但不是 libcurl,或者通常我立即将线程置于睡眠状态,那么 curl_global_init - 不能被调用?
还有一个难以理解的时刻:
如果你还没有调用 curl_global_init,curl_easy_init会自动调用。这在多线程情况下可能是致命的,因为 curl_global_init 不是线程安全的,并且由于缺乏适当的清理可能导致资源问题。
它没有明确说明,但我是否正确理解在 curl_easy_init() 之前调用 curl_global_init() 会告诉 curl_easy_init() 不要调用 curl_global_init() ?
请告诉我我是如何理解编译器标志的:
-MT - 告诉编译器使用静态 CRT 编译代码
-MTd - 告诉编译器在调试模式下使用静态 CRT 编译代码
-MD - 告诉编译器使用动态 CRT 编译代码
-MDd - 告诉编译器在调试模式下用动态 CRT 编译代码
我的问题是,如果 CRT 库 - Visual Studio 附带,那么理论上使用 MD 和 MDd 标志编译的代码 - 不应该在未安装 VS 的 Windows 上运行?
但事实上,在没有安装Visual Studio的Windows上,MDd调试模式下编译的exe文件没有启动,Windows写入一些文件丢失。
这是在发布时编译的代码,但仍然是动态 MD - 它开始时没有问题。
但为什么 ?
你能告诉我用“shared lib”参数构建一个库是什么意思吗?也就是说,一个“共享库”——它与谁共享什么以及与谁共享?
这是否意味着库将被动态链接?像 Windows 的 .dll 吗?
我不太明白工作的结果strtok
:
我从strtok拿了完整的例子
并简单地将字符串和子字符串替换为您自己的:
int main()
{
char str[] = "hih1ihi";
char* pch;
printf("Splitting string \"%s\" into tokens:\n", str);
pch = strtok(str, "hi");
while (pch != NULL)
{
printf("%s\n", pch);
pch = strtok(NULL, "hi");
}
}
从字符串“ hi h1i hi ”和子字符串“hi”和应用strtok
- 我希望看到以下结果:
h1i
由于定界符 hi - 理论上应该被丢弃,但strtok
只输出:
一
请告诉我我哪里错了?