C++是否让自己编译的程序直接使用return指向数组的指针?
Does C++ let a program compiled by itself to return pointer to an array to be used directly?
例如,如果我有这样的代码字符串:
std::string code = R"(
#include<thread>
#include<iostream>
int main()
{
int array[@@size@@];
std::cout<<(size_t)&array[0]<<std::endl;
std::this_thread::sleep(1000000000);
return 0;
}
)";
boost::replace_all(code, "@@size@@", std::to_string(memSize));
然后如果我以编程方式将它保存到文件并像这样编译它:
system("g++ code.cpp");
然后 运行 它并解析它的输出,我可以直接使用地址以任何方式访问数组而不会出现段错误吗?进程是否有任何方式共享简单数组以在不使用任何其他 API 的情况下实现更快的消息传递或其他目的?
我的意思是,如果程序由当前进程使用 C++ 编译并运行,那么在访问它时是否有更多自由的优势?
对于C++来说,可能连进程的概念都没有。据我所知,标准中只提到了它们两次。
一次是关于 lock-free 原子的建议,建议它们在进程之间共享时也应该工作,一次是关于文件系统竞争的可能原因。
任何关于在进程之间实际共享内存的事情都取决于操作系统,因此可能需要一些特定于操作系统的 API 调用。
将整数文字转换为指针是实现定义的,可能完全没有意义。唯一可以安全地转换为指针的整数文字是 0
,它会变成 nullptr
.
因此,即使忽略所有关于进程位于不同地址空间并在现代操作系统上相互保护的所有内容,您仍然无法以可移植的方式访问该数组。
一旦其他进程完成,您当然无法访问该数组。
例如,如果我有这样的代码字符串:
std::string code = R"(
#include<thread>
#include<iostream>
int main()
{
int array[@@size@@];
std::cout<<(size_t)&array[0]<<std::endl;
std::this_thread::sleep(1000000000);
return 0;
}
)";
boost::replace_all(code, "@@size@@", std::to_string(memSize));
然后如果我以编程方式将它保存到文件并像这样编译它:
system("g++ code.cpp");
然后 运行 它并解析它的输出,我可以直接使用地址以任何方式访问数组而不会出现段错误吗?进程是否有任何方式共享简单数组以在不使用任何其他 API 的情况下实现更快的消息传递或其他目的?
我的意思是,如果程序由当前进程使用 C++ 编译并运行,那么在访问它时是否有更多自由的优势?
对于C++来说,可能连进程的概念都没有。据我所知,标准中只提到了它们两次。
一次是关于 lock-free 原子的建议,建议它们在进程之间共享时也应该工作,一次是关于文件系统竞争的可能原因。
任何关于在进程之间实际共享内存的事情都取决于操作系统,因此可能需要一些特定于操作系统的 API 调用。
将整数文字转换为指针是实现定义的,可能完全没有意义。唯一可以安全地转换为指针的整数文字是 0
,它会变成 nullptr
.
因此,即使忽略所有关于进程位于不同地址空间并在现代操作系统上相互保护的所有内容,您仍然无法以可移植的方式访问该数组。
一旦其他进程完成,您当然无法访问该数组。