为了理解指针,我编写了下面的代码。
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
string a = "hello";
const char *st = &a[0];
printf("%p\n", &st[0]);
printf("%p\n", &(a[0]));
printf("%c\n", *st);
printf("%p", &a);
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出
0x1265028
0x1265028
h
0x7ffe26a91c40
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确&a的应该返回字符串的地址,为什么返回的值与&a其余的不同?
我想知道是否有一种方法可以以编程方式禁用字符串SSO,使其不使用本地缓冲区作为短字符串?
请问,为什么我需要这个.我很好,如果不能关闭只是想确定.
我读过性能方面的字符数组比std :: string更好/更快。但是我个人觉得使用std :: string更容易。
我目前正在编写一些数据库API,这些API会将数据提取/插入数据库中。在这些API中,我想使用std字符串,但是我不确定由于我的选择我会付出多少性能损失。我的API将查询数据库,因此将涉及网络IO。
性能损失是否比网络延迟(〜10 ms)少得多,因为在这种情况下,我很乐意使用std :: string。
我是 C++ 新手,最近通过 u-demy 讲座学习了指针和参考资料。讲座结束后,我正在解决使用单独的函数反转字符串的问题。我想出了一个代码,但由于某种原因,我可以使用 [] 表示法访问单个字符(就像reverse[0]等于!)但是当我打印整个字符串时,我得到一个空字符串?是什么导致了这个问题?
提前感谢您的宝贵时间!
这里我粘贴了我的代码:
#include <iostream>
// using namespace std;
std::string reverse_string(const std::string &str) {
std::string reversed;
size_t size {str.length()};
for(int i{}; i < size/2; i++) {
reversed[i] = str[(size-1)-i];
reversed[(size-1)-i] = str[i];
}
return reversed;
}
int main() {
// Write C++ code here
std::string input = "Hello, World!";
std::string reversed = reverse_string(input);
std::cout << reversed << std::endl; //I get nothing, BUT
std::cout << reversed[0] << std::endl //here I do get a …Run Code Online (Sandbox Code Playgroud) 当我和std::string我一起去的时候,我决定做以下事情:
int main(int argc, char **argv)
{
std::string s = "Hello World";
s.~basic_string();
std::cout << s.c_str();
}
Run Code Online (Sandbox Code Playgroud)
但是,它什么都不打印,没有垃圾.但是,在我的 basic_string课堂上,当调用析构函数时,我会得到垃圾.怎么std::string办呢?我使用an allocator和constructs,destroys,allocates和deallocates,但它仍然不起作用.
注意:我不是在寻找我班级的解决方案,而是要了解std::string它是如何做到的.
我遇到了一个问题,我需要找到数组的大小来确定数组的长度。我的理解是一个字符是 1 个字节,一个字符串是 2 个字节('\0'字符的额外字节)。
但是,我发现字符串数组的单个元素是 24 个字节。
我输出了一个字符串、字符和整数变量的大小来验证我的理解。我对 int、char 和 string 数组的单个元素做了同样的处理。
#include <iostream>
using namespace std;
int main()
{
string strArr[1] = {" "};
cout
<< sizeof " " << endl
<< sizeof strArr[0] << endl
<< sizeof strArr << endl << endl;
char charArr[1] = {'a'};
cout
<< sizeof 'a' << endl
<< sizeof charArr[0] << endl
<< sizeof charArr << endl << endl;
int intArr[1] = {1};
cout
<< sizeof 1 << endl
<< …Run Code Online (Sandbox Code Playgroud) 我不确定以前是否有人问过这个问题,所以我会试一试。
我有用于加载大客户列表(20 万个客户)的代码。每个客户端都存储在一个(当前)固定大小的结构中,其中包含他的姓名、地址和电话号码,如下所示:
struct client {
char name[80];
char address[80];
char phonenumber[80];
};
Run Code Online (Sandbox Code Playgroud)
如您所见,该结构的大小为 240 字节。因此,200k 客户端将占用 48MB 内存。显然,这种结构的优点是易于管理并为回收客户创建“免费列表”。但是,如果明天我需要加载 5M 客户端,那么这将增长到 1.2Gb 的 RAM。
现在,显然在大多数情况下,客户的姓名、地址和电话号码占用的空间远少于 80 个字节,因此我想到使用如下结构代替上述结构:
struct client {
char *name;
char *address;
char *phonenumber;
};
Run Code Online (Sandbox Code Playgroud)
然后让 *name、*address 和 *phonenumber 指向以确切所需大小动态分配的结构,用于存储每个信息。
然而,我确实怀疑,随着更多客户端以这种方式加载,它会大大增加所需的 new[] 和 delete[] 分配的数量,我的问题是这是否会在某些时候损害性能,例如,如果我想突然删除 1M 客户端中的 500k 并用 350k 不同客户端替换它们?
我怀疑在我分配了 1M 个“可变长度”小缓冲区之后,如果我“删除”其中的许多缓冲区,然后想要创建新的分配来回收已删除的那些,是否会导致分配器的一些开销找到他们?