我一直在探索C++ 11的新Unicode功能,虽然其他C++ 11编码问题非常有用,但我对cppreference的以下代码片段有疑问 .代码写入然后立即读取以UTF-8编码保存的文本文件.
// Write
std::ofstream("text.txt") << u8"z\u6c34\U0001d10b";
// Read
std::wifstream file1("text.txt");
file1.imbue(std::locale("en_US.UTF8"));
std::cout << "Normal read from file (using default UTF-8/UTF-32 codecvt)\n";
for(wchar_t c; file1 >> c; ) // ?
std::cout << std::hex << std::showbase << c << '\n';
Run Code Online (Sandbox Code Playgroud)
我的问题非常简单,为什么循环中wchar_t需要for?一个u8文本字符串可以使用一个简单的声明char *和UTF-8编码的位布局应告诉系统字符的宽度.似乎有一些从UTF-8到UTF-32的自动转换(因此wchar_t),但如果是这种情况,为什么转换是必要的?
我在Swift中有很多支持的枚举Strings.考虑到枚举代表的内容,这是有道理的,并且考虑到以下代码块永远不必写入,这是实用的:
public enum MyEnum : String {
...
func stringValue() -> String {
switch self {
...
}
}
// I can just use .rawValue() instead.
}
Run Code Online (Sandbox Code Playgroud)
我无法找到的东西是关于非Integral类型支持的Enums的内部工作和性能的大量信息.具体来说,我正在寻找以下问题的答案:
String散列或Enums得到它们自己的==运算符,无论基础类型("真O(1)")如何,它都可以在其可能的值上运行?Enum(rawValue:)积分和非整数类型的构造函数的复杂性是多少?为了解释这个问题,我对OpenGL及其背后的数学有了深入的了解,虽然我从未接触过与DirectX相关的任何内容,但我想这些概念是相似的.
关于为什么三角形用于3D图形有很多信息(它们必须是平面的,除了较小的三角形之外是不可分割的等等).但是,我想知道三角形是否只是存储和操作3D数据的简便方法(关于插值的简单数学等),或者如果图形卡中存在硬件限制,只能实际允许渲染三角形(例如基本上只能应用于三角形的指令).
接下来,有没有办法实现图形渲染的逐像素控制(正如这个问题的答案简要概述).虽然我很欣赏通过驱动程序对单个像素进行直接控制,但是有什么办法可以在渲染环境中实现这种控制吗?是否完全避免"避免三角形"?
... Clang可用于发出bitcode,使用Visual Studio的link.exe直接发出目标文件甚至链接的可执行文件.
为什么Link.exe在Windows上使用必要?而且,就此而言,Mac/Linux上使用了什么?再往下说:
Compile the program to object code using the LLC code generator:
C:\..> llc -filetype=obj hello.bc
Link to binary using Microsoft link:
C:\..> link hello.obj -defaultlib:libcmt
Run Code Online (Sandbox Code Playgroud)
为什么LLC不能执行最后一步?LLI似乎工作得很好所以我认为它在link.exe某种程度上可以在引擎盖下互操作- 为什么不能LLC?
在Ruby中,对于一个String或Array(等)对象来说,"冻结"是什么意思?设置或修改此属性的方式/位置?
在C中,您在结构中定义字段的顺序是它们将在内存中实例化的顺序.考虑到内存对齐,下面的结构在内存中的大小为8字节,如图所示,但如果字段反转则只有6个字节,因为不需要任何对齐填充.
struct s {
int32_t a;
/* 2 bytes of padding to align a 64 bit integer */
int64_t b;
}
Run Code Online (Sandbox Code Playgroud)
这种排序保证存在于C结构,C++类(和结构)和Objective-C类中.
对于Swift类和结构中的字段,存储顺序是否同样有保证?或者(鉴于该语言不支持与列出的其他语言相同的指针),编译器是否在编译时为您重新安排它们?
我已经阅读了这两个SO问题:要运送哪些运行时库?和GCC中包含的运行时库的许可证? - 两者都非常有帮助,但不是我想要的.
我总是编写程序在我自己的机器上使用,这从来没有给我带来任何问题,但现在我想开始在其他机器上运行软件,我对运行时要求保持警惕.
编辑:见下面的例子,这是误导.
具体来说,如果我在Windows机器上编写C++程序,使用gcc通过MinGW编译,并希望在另一台机器上运行它:
另外,一个相同的例子,除了这次是Objective-C程序.是否将libobjc.dll文件发送到足以允许程序正常执行的其他计算机?
我习惯在安装了开发工具等的机器上运行程序,但现在我想在通用机器(朋友,同事等)上运行它们,我不太清楚该做什么!
编辑:为了回应大厦的回答,我觉得我应该澄清一下我在寻找什么.我知道如何识别我的程序使用的必要的DLL(/ dylibs等)(虽然我习惯于手动完成这项工作;我没有听说过任何工具).我的问题更多的是"我现在该怎么办?"
可能需要一个更一般的例子:
假设我编写了一个程序,其中包含从C++,C和/或Objective-C(2)代码派生的目标文件.我使用了一些使用MinGW的gcc成功编译的Windows API代码.我也有一个我在Visual Studio(C++)中编写的自定义DLL.
我已经确定了我的程序将在运行时使用哪个DLL(其中一个可能是GCC的libobjc.dll,我不确定这是否会/应该在Windows机器上有所作为,但我想尽可能使其尽可能通用) - " 必备DLL ".
我想在我的同事的计算机上运行它,其中大多数运行Windows 7,但有些现在运行Windows 8.从一开始就为了完整起见:
基本上我正在尝试确定在系统运行时要求方面在另一台机器上开发和运行应用程序的整个思维过程.
假设我有一个名为 的类Server,我想让其他Plugins人为它编写代码。SayPlugin是一个接口,它扩展Runnable并添加了一个方法:void init(...). 插件的工作是收集数据并将其发送到服务器。然而,当需要向服务器发送数据时,它是如何做到的呢?来自 C 和 C++ 我正在寻找沿着函数指针的思路。尽管我没有在 Java 标准类库之外找到示例,但在 Java 中似乎是可能的。
我如何将方法引用传递给init方法,以便它可以由 存储Plugin,然后我如何在插件想要发送数据时调用该方法?现在说所需的 Server 方法是:void sendData(Integer data)。
例如:
// Inside Server
Plugin p = new PluginImplementation();
p.init(this::sendData);
// Plugin init
public void init(?? sendMethod) {
storedSendMethod = sendMethod;
// ...
}
// Plugin run
public void run() {
// ...
storedSendMethod(x) // Sends data to server
// ...
}
Run Code Online (Sandbox Code Playgroud) 这是C和C++的理论问题.
我有一个4x4矩阵类型,其定义非常简单:
typedef float Matrix44[16];
Run Code Online (Sandbox Code Playgroud)
我也有很多方法将Matrix44参数作为参数,例如:
bool matrixIsIdentity(Matrix44 m);
Run Code Online (Sandbox Code Playgroud)
我还有一个自定义内存分配方案,在堆上预先分配大面积内存,然后我手动管理该预取内存的分配.因此我已经用我自己的实现替换/重载malloc/ new.问题是,自定义malloc和new本质上都返回一个指针,而不是一个对象.
通常,我只会做以下事情:
// Method 1
1] Matrix44 mat = { ... };
2] bool res = matrixIsIdentity(mat);
Run Code Online (Sandbox Code Playgroud)
但是,第1行分配mat在堆栈上,而不是我想要的自定义内存区域.另一种选择是:
// Method 2
1] Matrix44 *mmat = myMalloc(...);
1a] Matrix44 *nmat = new ...
2] bool res = matrixIsIdentity(*mat);
Run Code Online (Sandbox Code Playgroud)
这里的问题是我必须使用解引用运算符来丢弃我的代码.现在一个选择是重写所有要采用的方法Matrix44*,但是,由于这是理论上的,我想假设这不是一个选项.
因此我的问题变成:有没有办法在C和/或C++中声明一个自动变量Method 1 Line 1,但它是否遵循备用分配方案(如Method 2 Line 1)?
(我很欣赏这可能涉及与编译器相关的讨论,但我还没有为此添加标签)
假设我有一个C++类,其实现看起来像这样:
// ...
MyClass::iterativeFunction() {
for (int i = 0; i < 1000000; i++) {
performAction(i);
}
}
MyClass::performAction(int index) {
// Block of code (non-inline-able)
}
// ...
Run Code Online (Sandbox Code Playgroud)
在C++级别,我是否可以控制这些方法的空间局部性,或者我是否只是希望编译器会注意到相关方法并相应地优化其程序集?理想情况下,我希望它们彼此相邻,以便将它们一起加载到指令缓存中,但我不知道如何让编译器知道我真的希望这种情况发生.