- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在对不可变的字符串以及c++的here,here进行一些阅读,而且我认为我对事物的工作方式有很好的了解。但是,我已经建立了一些假设,我想由一些人来进行验证。一些假设比标题所暗示的更为笼统:
最佳答案
据我所知,std::string不能假设输入字符串是数据段中的只读常量字符串。因此,第(3)点不适用。它很可能会分配一个缓冲区并将字符串复制到缓冲区中。
请注意,C++(与C一样)具有用于编译时的const限定符,出于两个原因使用它是一个好主意:(a)它可以帮助您发现错误,如果声明a = 5;
则声明为a
,例如const
编译失败; (b)编译可能能够更轻松地优化代码(否则可能无法确定对象是常量。)
但是,C++具有特殊的强制类型转换,以删除变量的const
-ness。因此,可以像a
一样强制转换const_cast<int&>(a) = 5;
变量并为其赋值。 std::string
也可以删除其const
-ness。 (请注意,C没有特殊的强制类型转换,但是它提供了完全相同的行为:* (int *) &a = 5
)
是否所有类成员都在最终的二进制文件中定义?
否std::string
,因为大多数STL使用模板。模板每单位(您的.o目标文件)编译一次,该链接将自动减少重复项。因此,如果您查看所有.o文件的大小并将其相加,则最终输出将非常小。
这也意味着仅将单元中使用的功能编译并保存在目标文件中。任何其他功能“消失”。话虽这么说,函数A经常调用函数B,所以即使您没有显式调用函数B,也将对其进行定义。
另一方面,由于这些是模板,因此通常会内联函数。但这是编译器的选择,而不是语言或STL的选择(尽管您可以使用inline
关键字来取乐;编译器仍然有权忽略它)。
较小的对象...不,在C++中,对象的大小非常特定,无法更改。否则,sizeof(something)会随地方而变化,并且C / C++会发疯!
但是,可以优化保存在只读数据节中的静态字符串。如果链接器/编译器足够好,他们将能够在同一位置合并相同的字符串。当然,这些只是计划char *
或wchar_t *
。微软编译器已经能够做到这一点了。
但是,字符串上的const并不总是会强制将字符串放入只读数据段中。通常,这取决于您的命令行选项。 C++可能已经纠正了这个问题,但是我认为C除非使用正确的命令行选项,否则仍会将所有内容放在读/写部分中。这是您需要进行测试以确保的结果(您的编译器可能会这样做,但是如果不进行测试,您将不知道。)
最后,尽管std::string可能不使用它,但C++提供了一个非常有趣的关键字,称为mutable。如果您听说过,您会知道可以将变量成员标记为可变成员,这意味着即使const函数也可以修改该变量成员。使用该关键字的主要原因有两个:(1)您正在编写多线程程序,并且该类必须是多线程安全的,在这种情况下,您将互斥体标记为可变的,非常实用; (2)您想使用一个缓冲区来缓存一个计算成本很高的值,该缓冲区仅在请求该值时才初始化,以免浪费时间,否则该缓冲区也将变为可变的。
因此,“不变”概念实际上只是您可以在更高层次上依靠的东西。实际上,现实往往大不相同。例如,std::string c_str()
函数可以重新分配缓冲区以添加必要的'\ 0'终止符,但是该函数被标记为const
:
const CharT* c_str() const;
std::string
分配许多缓冲区来存储大字符串(而不是使用可能成本高昂的
realloc()
)。
B = A;
)时,就不会复制字符串数据。相反,A和B将共享相同的数据缓冲区。一旦修改了A或B,然后才复制数据。这意味着调用通过复制接受字符串的函数不会浪费那么多时间:
int func(std::string a)
{
...
if(some_test)
{
// deep copy only happens here
a += "?";
}
}
std::string b;
func(b);
关于c++ - 关于不可变[string]对象的问题和验证C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541869/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!