我继续读到,在C中,使用指针算法通常比下标数组访问更快.即使使用现代(据称是优化的)编译器,这是真的吗?
如果是这样,当我开始在Mac上学习C到Objective-C和Cocoa时,情况仍然如此吗?
在C和Objective-C中,哪种是数组访问的首选编码风格?被认为(由各自语言的专业人士)更清晰,更"正确"(缺乏更好的术语)?
我已经看到了一些代码,以及我的编译器生成的一些错误,这些错误**在变量之前有一个' '标记(例如**变量名未引用 - 或者其他东西,我不能完全回想起来).我相当肯定这与指针有关,如果我不得不猜测它看起来像是试图取消引用两次.' **'是相当不容易的.有人能指出我一个好的网站/文档,或者有人会在这里解释一下吗?
谢谢.
很好的回应.如果我可以添加,那么指向指针的指针有什么用呢?你不应该只使用原始指针而不是创建另一个指向原始指针的指针吗?
所以我正在经历一些面试问题,我遇到了一个关于void和null指针的问题,声称:
没有返回类型的指针称为空指针.它可以是任何类型的数据类型.
这彻底迷惑了我!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的.我假设void是一个返回类型,null是一个值.但我只是一个代码新手,我不确定我是对的.
请表达您对空指针是什么以及空指针是什么的看法.我不是在寻找null和void之间的区别.
处理这种情况最简洁的方法是什么:
func a() string {
/* doesn't matter */
}
b *string = &a()
Run Code Online (Sandbox Code Playgroud)
这会生成错误:
不能取一个()的地址
我的理解是,如果采用地址,Go会自动将局部变量提升到堆中.这里很清楚,要采用返回值的地址.处理这个问题的惯用方法是什么?
我有一个像这样的golang结构:
type MyStruct struct {
Id string
}
Run Code Online (Sandbox Code Playgroud)
和功能:
func (m *MyStruct) id() {
// doing something with id here
}
Run Code Online (Sandbox Code Playgroud)
我还有另一个这样的结构:
type MyStruct2 struct {
m *MyStruct
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个功能:
func foo(str *MyStruct2) {
str.m.id()
}
Run Code Online (Sandbox Code Playgroud)
但是我在编译时遇到错误:
str.m.id undefined (cannot refer to unexported field or method mypackage.(*MyStruct)."".id
Run Code Online (Sandbox Code Playgroud)
如何正确调用此功能?
谢谢
我被要求描述这些代码行正在为大学作业做些什么
int main() {
int t1[] = {0,0,1,1,1}, t2[] = {0,0,1,1,1};
int *p1 = t1, *p2 = t2;
while (!*p1++ || !*p2++);
cout << (p1-t1) << endl;
cout << (p2-t2) << endl;
}
Run Code Online (Sandbox Code Playgroud)
我的看法是,创建了2个int类型的数组并填充了值,创建了2个指针并指向每个数组,然后我开始遇到麻烦.
while (!*p1++ || !*p2++);
Run Code Online (Sandbox Code Playgroud)
对我来说这是说在0移动*p1一个地方的位置或0移动*p2一个地方的位置时,我对这个假设真的没有信心吗?
cout << (p1-t1) << endl;
Run Code Online (Sandbox Code Playgroud)
那么我们继续前进cout,现在我对此的看法是,我正在从位置减去p1位置t1,在那里p1被while定位并t1指向数组中的第一个位置.我可能完全错了,我只是在学习指针,所以如果我的假设错了,请记住这一点.
在他的一个主题演讲中,Andrei Alexandrescu建议,在64位平台上,使用32位数组索引比使用原始指针更快:
第16页:http://www.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c-15708507
在他的Facebook帐户上,他更精确,并说:"更喜欢数组索引到指针(这个似乎每十年逆转一次)."
我已经尝试了许多方法来找到差异,但我还没有设法构建任何显示这种差异的程序.知道安德烈,我不会感到惊讶,差异不超过百分之几,但如果有人找到这样的例子,我会很高兴.
这是我做过的测试.我选择n = 5000,足够大以获得合适的时序并且足够小以使一切都适合L1缓存.我循环了几次,以便CPU频率上升.
#include <iostream>
#include <chrono>
int main(int argc, const char* argv[]) {
const int n{5000};
int* p{new int[n]};
// Warm up the cache
for (int i{0}; i < n; i++) {
p[i] += 1;
}
for (int j{0}; j < 5; j++) {
{
auto start_pointer = std::chrono::high_resolution_clock::now();
for (int* q{p}; q != p + n; ++q) {
++(*q);
}
auto end_pointer = std::chrono::high_resolution_clock::now();
auto time_pointer = std::chrono::duration_cast<std::chrono::nanoseconds>(
end_pointer - …Run Code Online (Sandbox Code Playgroud) 我和C一起工作,我有点生疏了.我知道它*有三个用途:
但是,**在变量声明之前有两个星号()时它意味着什么:
char **aPointer = ...
Run Code Online (Sandbox Code Playgroud)
谢谢,
斯科特
我已经使用了几年的指针,但我最近才决定转换到C++ 11的智能指针(即唯一,共享和弱).我对它们做了很多研究,这些是我得出的结论:
因此,考虑到这些原则,我开始修改我的代码库以利用我们新的闪亮智能指针,完全打算清除尽可能多的原始指针.然而,我对如何最好地利用C++ 11智能指针感到困惑.
例如,让我们假设我们正在设计一个简单的游戏.我们认为将虚构的Texture数据类型加载到TextureManager类中是最佳的.这些纹理很复杂,因此按值传递它们是不可行的.此外,让我们假设游戏对象需要特定的纹理,具体取决于它们的对象类型(即汽车,船等).
之前,我会将纹理加载到矢量(或其他容器,如unordered_map)中,并在每个相应的游戏对象中存储指向这些纹理的指针,以便在需要渲染时可以引用它们.让我们假设纹理保证比指针寿命更长.
那么,我的问题是如何在这种情况下最好地利用智能指针.我看到几个选项:
将纹理直接存储在容器中,然后在每个游戏对象中构造unique_ptr.
class TextureManager {
public:
const Texture& texture(const std::string& key) const
{ return textures_.at(key); }
private:
std::unordered_map<std::string, Texture> textures_;
};
class GameObject {
public:
void set_texture(const Texture& texture)
{ texture_ = std::unique_ptr<Texture>(new Texture(texture)); }
private:
std::unique_ptr<Texture> texture_;
};
Run Code Online (Sandbox Code Playgroud)
然而,我对此的理解是,新的纹理将从传递的引用中复制构造,然后由unique_ptr拥有.这让我觉得非常不受欢迎,因为我会使用与使用它的游戏对象一样多的纹理副本 - 击败指针点(没有双关语意).
不直接存储纹理,而是存储容器中的共享指针.使用make_shared初始化共享指针.构造游戏对象中的弱指针.
class TextureManager {
public:
const std::shared_ptr<Texture>& texture(const std::string& key) const
{ return textures_.at(key); }
private:
std::unordered_map<std::string, std::shared_ptr<Texture>> textures_;
};
class GameObject {
public:
void set_texture(const std::shared_ptr<Texture>& …Run Code Online (Sandbox Code Playgroud)是否可以从指向字符串的指针获取字符串值?
我正在使用goopt包来处理标志解析,而包只返回*string.但我想使用这些值来调用地图中的函数.
举个例子.
var strPointer = new(string)
*strPointer = "string"
functions := map[string]func() {
"string": func(){
fmt.Println("works")
},
}
//Do something to get the string value
functions[strPointerValue]()
Run Code Online (Sandbox Code Playgroud)
你可以看到这里展示的问题http://play.golang.org/p/1s0-d-GO-L
pointers ×10
c++ ×5
go ×3
arrays ×2
c ×2
c++11 ×1
null-pointer ×1
objective-c ×1
performance ×1
return ×1
rvalue ×1
struct ×1
temporary ×1